Frage Das neu erstellte PNG-Bild ist schwarz


example image

Hinweis: SO hat das obige Referenzbild in JPEG konvertiert. Hier ist das transparentes PNG.


Es folgt ein Beispielcode, der ein PNG-Bild erstellt auf einer neuen Leinwand und bewahrt die Transparenz. Wie Sie sehen können, ermöglicht es auch Pixel-Level-Manipulation, z. mit einer benutzerdefinierten Funktion wie custom_func($r, $g, $b), was am Ende dieser Frage besser dargestellt ist.

Im Grunde dieser Code neu erstellt / neu gezeichnet das obige Bild auf einer neuen Leinwand erfolgreich wie es ist. Bitte beachten Sie, dass der Himmel im obigen Bild vollständig transparent ist.

    $image = imagecreatefrompng('grass.png');

    $x_dimension = imagesx($image);
    $y_dimension = imagesy($image);
    $new_image = imagecreatetruecolor($x_dimension, $y_dimension);

    // create a transparent canvas
   $trans_color = imagecolorallocatealpha($new_image, 0x00, 0x00, 0x00, 127);
   imagefill($new_image, 0, 0, $trans_color);

     for ($x = 0; $x < $x_dimension; $x++) {
          for ($y = 0; $y < $y_dimension; $y++) {
          $rgb = imagecolorat($image, $x, $y);
          $r = ($rgb >> 16) & 0xFF;
          $g = ($rgb >> 8) & 0xFF;
          $b = $rgb & 0xFF;
          $alpha = ($rgb & 0x7F000000) >> 24;
          //$pixel = custom_function($r, $g, $b);
          imagesetpixel($new_image, $x, $y, imagecolorallocatealpha($image, $r, $g, $b, $alpha));
      }
      }
     imagesavealpha($new_image, true);
     imagepng($new_image, 'grass-result.png');

Allerdings, wenn ich den gleichen Code auf diesem bestimmten PNG-Bild unten ausführen.

problematic png image 

Es gibt mir ein fast schwarzes Bild so.

very dark blue - almost black recreated image


Ich würde gerne verstehen, was hier passiert und warum? Am wichtigsten ist, dass ich gerne über mögliche Faktoren, die den Prozess beeinflussen könnten, Bescheid wissen könnte, damit ich mich damit befassen kann. Warum unterscheidet sich das Ergebnis von einem PNG zum anderen?

Idealerweise möchte ich, dass mein Code den Transparenzzustand (transparent, halbtransparent oder opak) des Quell-PNG-Bildes so wie es ist in dem neu erstellten Bild erhalten und übertragen kann. Wie Sie sehen können, konnte ich es erreichen, außer für den obigen Fall.


Nur für den Fall, hier ist meine Umgebung. Windows 7 - 64 Bit ** Wampserver2.5 ** Apache-2.4.9 ** Mysql-5.6.17 ** php5.5.12-64b. Auch hier ist ein var_dump des Bildes mit getimagesize() :

array (size=6)
  0 => int 228
  1 => int 230
  2 => int 3
  3 => string 'width="228" height="230"' (length=24)
  'bits' => int 8
  'mime' => string 'image/png' (length=9)

AKTUALISIEREN Hier ist der Beweis, dass das Beispielbild tatsächlich transparent ist und auch manipuliert werden kann, während die Transparenz erhalten bleibt. Beachten Sie, dass der untere Teil des Bildes jetzt bräunlicher ist. Dies wurde durch eine geringfügige Änderung dieser Linie erreicht imagesetpixel($new_image, $x, $y, imagecolorallocatealpha($image, 100, $g, $b, $alpha));

manipulated transparent image


5
2017-10-13 07:47


Ursprung


Antworten:


Ihr zweites Bild ist 8-Bit, dh es werden nur maximal 256 Farben unterstützt. Dies macht es zu einem "Paletten-basierten" Bild und als solches unterstützt es keine Alpha-Transparenz.

Durch einfaches Hinzufügen der folgenden Zeile nach dem Erstellen $image Sie können das Problem beheben:

imagepalettetotruecolor($image);

Dies hat keine Auswirkungen auf Bilder, die bereits True Color sind, also grass.png wird weiterhin korrekt verarbeitet. Von dem PHP Handbuchseite:

Gibt TRUE zurück, wenn die Konvertierung abgeschlossen wurde oder wenn das Quellbild bereits ein Echtfarbenbild ist, andernfalls wird FALSE zurückgegeben.


1
2017-10-13 12:58