[php] Bild bearbeiten (Farbton)

martin

Well-Known Member
Hallo

ich bräuchte ein kleines Script, das mir ein vorhandenes Bild mit einem anderen Farbton "überschreibt". Ich weiß nicht wie ich das erklären soll und deshalb war auch meine Google-Suche ziemlich schnell am Ende, weil ich den Begriff, den es sicher für mein Vorhaben gibt, nicht kenne!
Deshalb poste ich hier mal 2 Bilder... 1 ist das Original und 2 sollte anhand eines php Scripts automatisch entstehen. Ich hoffe dass sich das mit der GD Library machen lässt, wenn nicht, muss ich halt auf imagick ausweichen.
Hier die Bilder:

Gruß
martin
 

Anhänge

  • 1.jpg
    1.jpg
    35 KB · Aufrufe: 381
  • 2.jpg
    2.jpg
    11,8 KB · Aufrufe: 338
Hallo kamikaze

danke für die Antwort. Im Prinzip ist das genau das was ich suche, allerdings bekomme ich es nicht so hin, wie ich es gerne hätte. Also wie gesagt, ich möchte gerne das "Bestandteil", welches in 1.jpg abgebildet ist, in verschiedenen Farben anbieten. Z.B. in #0F4336
Eben diese Farbe habe ich auch versucht mit dem imagefilter anzuwenden, doch dabei kommt 3.jpg heraus. Ich möchte dass weiß mit exakt #0F4336 ersetzt wird und alle anderen Farben eben ensprechend angepasst werden. Geht das irgendwie?
Ich habe auf der php Seite unter imagefilter imagefilterhue ausprobiert, leider bekomme ich auch damit nicht das gewünschte Ergebnis.

Gruß
 

Anhänge

  • 3.jpg
    3.jpg
    1,7 KB · Aufrufe: 315
Ich hab lange nix mit GD gemacht, aber ich kann dir die Bearbeitungschritte sagen, die du dafür brauchst.
Zweite Ebene erstellen, Füllung mit deinem Farbton, der Deckungsmodus ist 'Color'
Die Originalebene dublizieren, entsättigen und die Helligkeit invertieren. Das daraus resultierende Schwarzweissnegativ nutzt du als Ebenenmaske für die Farbene. Die Schwarzweiss-Ebene kann jetzt entfernt werden und das Image zusammengefügt werden.

Bau die Schritte zuerstmal in Gimp nach, um zu verstehen, was da genau gemacht werden muss und kümmer dich erst dann um die Umsetzung. Es ist nämlich nicht ganz trivial.
 
hi troll

danke für deine Anleitung. Leider weiß ich auch in gimp nicht so recht wie ich das anstelle :rolleyes:
Aber ich versuch mich jetzt mal Schritt für Schritt zu nähern...
Dies sind meine ersten Schritte...
PHP:
//Ebene original_bild erstellen mit 1.jpg als Hintergrund
$original_bild = imagecreatefromjpeg('../images/1.jpg');
$groesse = getimagesize('../images/1.jpg');

//Ebene mit neuer Farbe als Hintergrund erstellen
$kopie = imagecreatetruecolor($groesse[0],$groesse[1]);
$farbe_neu = imagecolorallocate($kopie, 15, 67, 54);
imagefill($kopie,0,0,$farbe_neu);

soweit so gut. Jetzt müsste nach deiner Anleitung also die "Ebene" $kopie entsättigt und dessen Helligkeit invertiert werden. Die Helligkeit könnte man mit imagefilter (IMG_FILTER_BRIGHTNESS) verändern, allerdings weiß ich nicht wie ich invertieren kann, man kann nämlich lediglich Werte von -255 bis +255 angeben. :confused:
Zum Entsättigen habe ich leider nichts gefunden!
 
Hm, vielleicht kann ichs anders erklären....
Ein Pixel, dass im Original 255,255,255 hat, wird komplett mit deiner Farbe überschrieben
Ein Pixel, dass im Original 0,0,0 hat wird nicht überschrieben.
Ein Pixel, dass im Original 128,128,128 hat wird mit 50%Transparenz mit deiner Farbe überschrieben.

Das triffts nicht genau - eine Farbüberdeckung ist noch etwas Anderes, aber vom Ansatz her sollte das einigermassen vernünftige Ergebnisse bringen. Die Pixel einzeln zu berechnen ist zu aufwändig, du brauchst da definitiv nen effektiven Algo.
 
Jetzt hab'ich schon besser verstanden wie das funktioniert... danke
Apropos effizienter Algorithmus... gibt es für das was ich vorhabe einen Fachausdruck? Wenn ich den wüsste, dann könnte ich ja mal googeln. Schließlich haben sicher mehrere Leute so ein Anliegen und ich muss das Rad ja nicht neu erfinden!
 
Ja, das sind halt Ebnen und Ebnenmasken. Das beherrscht eh schon jeder Grafikeditor. Das gtk-Geraffel und gegl sollten das alle schon intus haben.
 
so ich glaube ich habe jetzt etwas gefunden.... hier-> http://www.devx.com/webdev/Article/37179/0/page/5

Im Photoshop unter Farbton/Sättigung kann ich 3 Werte verändern, Farbton/Sättigung/Lab-Helligkeit. Wenn ich da unter Sättigung das Maximum (+100) eingebe und unter Lab-Helligkeit -56 (-100 wäre Max), dann erhalte ich annehmbare Ergebnisse egal welchen Farbton ich auswähle. die Farbtöne in PH gehen von 0 bis 360.

Ich habe die Scripts von der oben erwähnten Seite folgendermaßen zusammengefasst:

PHP:
for($j=0;$j<$H;$j++){
      for($i=0;$i<$L;$i++){ 
         $rgb = imagecolorat($im, $i, $j); 
      
         $r = ($rgb >> 16) & 0xFF;
         $g = ($rgb >> 8) & 0xFF;
         $b = $rgb & 0xFF;
      
         $getArrayHSB = RGBtoHSB($r,$g,$b);
           
         $brightness = 0.5; //[0.0, 1.0] - darker,  [1.0, 10.0] - brightner
         $getArrayHSB[2] = $brightness*$getArrayHSB[2];
         $getArrayHSB[2] = max(0.0,min($getArrayHSB[2],255.0)); 

         $saturation = 10; //[0,10]
         $getArrayHSB[1] = $saturation*$getArrayHSB[1];
         $getArrayHSB[1] = max(0.0,min($getArrayHSB[1],1.0)); 

         $hue = 5; //[0,10]
         $getArrayHSB[0] = $hue*$getArrayHSB[0];
         $getArrayHSB[0] = max(0.0,min($getArrayHSB[0],360.0)); 
        
         $getArrayRGB = HSBtoRGB($getArrayHSB[0],
            $getArrayHSB[1],$getArrayHSB[2]);
      
         $hsbrgb = imagecolorallocate($im, 
            $getArrayRGB[0], $getArrayRGB[1], 
            $getArrayRGB[2]);
         $result = (($rgb & 0xff000000)|($hsbrgb));
    
         imagesetpixel($im, $i, $j, $result);    
      }
   }

Ich habe jetzt einiges probiert, aber irgendwie komme ich mit den Werten $brightness $saturation $hue nicht an das Ergebnis von Photoshop hin. Irgendwie erhalte ich egal was ich eingebe immer ein dunkelgraues Bild.;'(
 
Zurück
Oben