< 16,7 Millionen Farbbild >

Erstellung eines Bildes mit allen 16.777.216 Farben

Fast alle Grafikprogramme bieten eine Funktion, mit der man die Farben eines Bildes zählen kann. Doch selbst hochauflösende Fotos haben kaum mehr als 200.000 verschiedene Farben zu bieten. Was für eine Verschwendung! ;-)
Das RGB-Farbmodell besitzt 16,7 Millionen Farben. Diese entstehen aus der Zusammensetzung von 256 Rot x 256 Grün x 256 Blau-Anteilen (0 bis 255). Das sind 2 hoch 24 bit (2^24).
Mein Wunsch war es nun, ein Bild zu erschaffen, in dem alle 16,7 Millionen Farben vertreten sind.

Projektierung

Zuerst mußte eine geeignete Bildgröße gefunden werden. Das Format 256 x 65536 hätte zwar einen sauberen optischen Farbverlauf ergeben, ist aber eine Zumutung für jeden Scrollbalken. Außerdem läßt sich solch ein Bild mit keinem heutigen (damaligen?) Grafikprogramm erstellen, geschweige denn bearbeiten. Deshalb entschied ich mich vorerst für ein Quadrat von 4096 x 4096.
Als Dateiformat entschied ich mich für TIFF, da es sich wie BMP um ein (oft) unkomprimiertes Format handelt und jeder Punkt einzeln abgespeichert wird. Somit gehen die Farben nicht verloren. (Im nachhinein stellte sich heraus, dass auch PNG einige Vorzüge hat.)
Die gängingen Grafikprogramme sind zur professionellen Bildbearbeitung gedacht und nicht zum pixelweise Erstellen eines Bildes. So habe ich auf eine Skriptsprache wie PHP oder Perl zurückgegriffen.
Im Beispiel wird mit Perl und Image::Magick gearbeitet.

Erklärung

Das Skript durchläuft drei FOR-Schleifen $i, $j und $k. Diese werden dann als Farbe $rot, $gruen oder $blau dem entsprechendem Wert aus dem Array @hexwert zugeordnet und in der Variablen $farbe abgespeichert. Mithilfe der Draw-Funktion von Image:Magick wird diese $farbe auf einen Punkt x,y = $spalte,$zeile gesetzt.
Nach diesem ersten Durchlauf sind die Zähler $spalte, $zeile und $zaehler (für die Farbe) um eins erhöht wurden.
Wenn die Spalte an ihr Ende bei 4096 kommt (da dieses Bild ja 4096 Pixel lang ist), springt das Skript um eine Zeile nach unten.
Weiterhin wurde alle 16 Zeilen ein Backup eingefügt. Falls das Skript vorzeitig abbrechen sollte, kann man es so wieder bei der letzten Sicherung neu starten.

# PERLSKRIPT FUER EIN BILD MIT 16.777.216 FARBEN -> www.medienvilla.com

#!usr/bin/perl

 use Image::Magick;

 push(@hexwert, '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff');

 $zaehler = 0;
 $spalte = 0;
 $zeile = 0;

 # SICHERUNGSKOPIE
 $backup = 16;
 $backupintervall = 16;

 $image = Image::Magick->new;

 $image->Set(size=>'4096x4096');
 $image->ReadImage('xc:white');

 print "\n Bild geladen ... \n\n";

 for ($i = 0; $i <= 255; $i++)
  {
   $rot = $hexwert[$i];

   for ($j = 0; $j <= 255; $j++)
    {
     $gruen = $hexwert[$j];

     for ($k = 0; $k <= 255; $k++)
      {
       $blau = $hexwert[$k];

	$zaehler = $zaehler + 1;

	# BEGINN DES FARBSPIELS
	    if ($spalte == 4096)
 		 { 
		  $spalte = 0;		# AN DEN ANFANG ZURUECK
		  $zeile = $zeile + 1;	# EINE ZEILE RUNTER
		  print " Zeile $zeile / 4095 \t Nr. $zaehler / 16777216 \t $farbe = $i $j $k \n";

		 if ($zeile == $backup)
		  {
		   print " Schreibe Backup fuer Zeile Nr. $backup ... \n";

		   $image->Write('image_16m_bkp_'.$backup.'.tif');

   		   $oldbackup = $backup - $backupintervall;
		   print " Loesche altes Backup : $oldbackup ... \n";
		   unlink('image_16m_bkp_'.$oldbackup.'.tif');

		   # Speicher leeren
		   undef $image;

		   $image = Image::Magick->new;
		   $image->Set(size=>'4096x4096');
		   $image->ReadImage('image_16m_bkp_'.$backup.'.tif');

		   print " Bild geladen ... \n";

		   $backup = $backup + $backupintervall;
		  }

		 }

	$farbe = "#".$rot.$gruen.$blau;

	$image->Draw(primitive=>'point', fill=>"$farbe", points=>"$spalte,$zeile");

	$spalte = $spalte + 1;

      } # ENDE DER DRITTEN SCHLEIFE

    } # ENDE DER ZWEITEN SCHLEIFE

  } # ENDE DER ERSTEN SCHLEIFE

 $image->Write('image_16m.tif');

 print " \n Zeile $zeile / 4095 \t Nr. $zaehler / 16777216 \t $farbe = $i $j $k \n";
 print " ASCII-Code Nummer &#0007; "; 	# SOUNDAUSGABE - COOL !
 print " \n ********************************************** Fertig  ! \n";

# PERLSKRIPT FUER EIN BILD MIT 16.777.216 FARBEN -> www.medienvilla.com

Ergebnis

Das Ergebnis ist ein Quadrat in dem alle RGB-Farben vorhanden sind.

16,7 Millionen Farben des RGB Modells in einem (hier verkleinerten) Bild

Natürlich sieht das noch nicht flüssig aus. Deshalb wurde in jeder "ungeraden" (1, 3, ...) Spalte die Zelle entweder oben-unten gespiegelt, oder normal belassen. In jeder "geraden" (2, 4, ...) Spalte wurde die Zelle enweder links-rechts gespiegelt oder sowohl links-rechts als auch oben-unten gespiegelt.
In jeder "geraden" Zeile wurde die Zelle entweder normal belassen oder links-rechts gespiegelt. In jeder "ungeraden" Zeile wurde die Zelle entweder normal belassen oder sowohl links-rechts als auch oben-unten gespiegelt.
(Als "Zelle" bezeichnet sich eine sichtbare Zelle in der Größe von 256x16 Pixel im Originalbild.)

16,7 Millionen Farben des RGB Modells in einem (hier verkleinerten) Bild

Schlußendlich wurde aus dem Quadrat von 4096x4096 nach langem Probieren und Rechnen doch ein Streifen von 1024x16384 Pixeln.

Download und weitere Informationen

Die Skripte zum Erstellen des Bildes mit dem "sauberen" (gespiegelten) Farbverlauf und für den Streifen sind zum Download vorhanden. Wer noch mehr solcher Bilder sehen möchte, findet unter www.allrgb.com weitere interessante Bilder.


Verwandte Themen: Html/Css Farbcodes Downloads PC Shutdown PW-Finder

Seite bewerten:  
  2.81/5 Punkten (27 Bewertungen)
2.81/5 27