So konvertieren Sie eine PNG-Datei in eine Webp-Datei
Lesezeit: 5 Minuten
Jordan Lipana
Ich muss ein Bild umwandeln (PNG) zu (Webp) Datei.
Nach dem Hochladen einer png Datei, die webp Bild wurde generiert, aber die webp Datei hat die Transparenz von a nicht kopiert png Datei, stattdessen wird ein schwarzer Hintergrund erstellt.
Danke, aber haben Sie eine Idee, wie Sie das Problem beheben können, ohne eine Bibliothek zu verwenden?
– Jordan Lipana
2. September 2019 um 13:25 Uhr
Nein, ich habe keine Ahnung, dies ohne Bibliothek zu implementieren.
– Vaibhavi S.
2. September 2019 um 13:29 Uhr
@JordanLipana Ich habe eine Lösung dafür. Aber es hängt von einer ausreichend hohen PHP-Version ab. Werde es in Kürze posten. Ich habe zuerst auf 5.6 getestet – nein geht. Dann auf 7.2 (Korrektur 7.3.0) – funktionierte. Ich werde meine Änderungen in 5.6 erneut überprüfen und dann die Lösung mit einem Haftungsausschluss veröffentlichen, wenn die PHP-Version von Bedeutung ist. Update: Lösung wurde gepostet.
– GetSet
24. Oktober 2019 um 1:51 Uhr
GetSet
Getestet auf 7.3.0 – funktioniert.
HAFTUNGSAUSSCHLUSS: Funktioniert möglicherweise nur mit späteren oder einigen PHP-Versionen.
Nur getestet auf 5.6.15 (funktionierte nicht, schwarzer Hintergrund) und 7.3.0 (funktionierte, transparenter Hintergrund).
Hier ist der Code:
// get png in question
$pngimg = imagecreatefrompng($file);
// get dimens of image
$w = imagesx($pngimg);
$h = imagesy($pngimg);;
// create a canvas
$im = imagecreatetruecolor ($w, $h);
imageAlphaBlending($im, false);
imageSaveAlpha($im, true);
// By default, the canvas is black, so make it transparent
$trans = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagefilledrectangle($im, 0, 0, $w - 1, $h - 1, $trans);
// copy png to canvas
imagecopy($im, $pngimg, 0, 0, 0, 0, $w, $h);
// lastly, save canvas as a webp
imagewebp($im, str_replace('png', 'webp', $file));
// done
imagedestroy($im);
Bearbeiten 1. *** BEWEIS
Die PHP-GD-Bibliothek basiert auf der libgd-Bibliothek.
Relevanter Code zum Speichern (Datei: gd_webp.c), Auszug, der die Achtung des Alpha-Kanals zeigt, falls vorhanden:
c = im->tpixels[y][x];
a = gdTrueColorGetAlpha(c);
if (a == 127) {
a = 0;
} else {
a = 255 - ((a << 1) + (a >> 6));
}
*(p++) = gdTrueColorGetRed(c);
*(p++) = gdTrueColorGetGreen(c);
*(p++) = gdTrueColorGetBlue(c);
*(p++) = a;
In Bezug auf static int _gdImageWebpCtx (gdImagePtr im, gdIOCtx * outfile, int quality)
Der von mir vorgestellte PHP-Code beruht auf der Tatsache, dass Alpha in der GD-Bibliothek und als solches tatsächlich respektiert wird funktioniert Wenn es in einer neueren PHP-Version als der von Ihnen verwendeten getestet wird, habe ich speziell in 7.3.0 getestet, kann aber in frühen Versionen nach Ihrer Version funktionieren.
Danke, aber meine Version von PHP ist 5.6
– Jordan Lipana
24. Oktober 2019 um 5:22 Uhr
@JordanLipana Meine Lösung löst Ihr Problem technisch. Wir werden sehen, wie sich dies jedoch auswirkt. Jordan, es wird einfach nicht von der GD-Bibliothek in 5.6 unterstützt. Diese Version von GD in PHP 5.6 respektiert den Alpha-Modus nicht. Google dokumentiert 3 Modi. Das PHP 5.6 verwendet den Alpha-Kanal-Modus für webp nicht, soweit meine Tests gingen.
– GetSet
24. Oktober 2019 um 5:24 Uhr
Hören Sie, ich hatte letztes Jahr einen Job gemacht, um die endgültigen Bilder von Coupons basierend auf der GD-Bibliothek zusammenzusetzen, also habe ich mich darauf gestürzt, als ich Ihre Frage sah. Ich habe die C-Quelle für Ihr Problem überprüft, um zu sehen, ob Alpha eingehalten wurde: Es ist in der neuesten Version. Ich habe nicht versucht, es auf das zurückzuführen, was für PHP 5.6 verwendet wurde. Die Chancen stehen gut, dass Alpha damals in PHP nicht unterstützt wurde, warum sonst sollte es bisher von niemandem eine Lösung für diese Version geben?
– GetSet
24. Oktober 2019 um 5:30 Uhr
Hallo, haben Sie einen Link, der besagt, dass die GD-Bibliothek in PHP 5.6 für die Konvertierung von PNG in WebP nicht unterstützt wird? Das muss ich meinem Team sagen.
– Jordan Lipana
24. Oktober 2019 um 5:32 Uhr
@JordanLipana Verstehe, was ich behaupte, bevor ich Beweise liefere. PHP 5.6 unterstützt das Speichern auf webp. Das ist ein Fakt. Ich kann also nicht behaupten, dass dies nicht wahr ist, wie Sie behaupten. Was ich aber sage ist, dass es das nicht tut Respekt der Alphakanal, der das Ergebnis ist Sie Wunsch nach einem transparenten (nicht schwarzen) Hintergrund.
– GetSet
24. Oktober 2019 um 5:37 Uhr
DubVader
Möglicherweise müssen Sie den Alphakanal aktivieren und speichern. Versuchen Sie vielleicht Folgendes:
Vielen Dank, aber der Code konvertiert das PNG nicht in Webp. Die habe ich auch modifiziert imagewebp($file, str_replace('png', 'webp', $file)); und änderte es in imagewebp($im, str_replace('png', 'webp', $file)); aber das Ergebnis ist immer noch dasselbe, es wandelt die Transparenz in Schwarz um.
– Jordan Lipana
23. Oktober 2019 um 6:51 Uhr
Ich habe eine Lösung dafür. Aber es hängt von einer ausreichend hohen PHP-Version ab. Werde es in Kürze posten. Ich habe zuerst auf 5.6 getestet – nein geht. Dann auf 7.2 – funktionierte. Ich werde meine Änderungen in 5.6 erneut überprüfen und dann die Lösung mit einem Haftungsausschluss veröffentlichen, wenn die PHP-Version von Bedeutung ist.
– GetSet
24. Oktober 2019 um 0:46 Uhr
Das Quellbild muss nicht kopiert werden, wenn das Ausgabeformat volle Alpha-Transparenz unterstützt. Stattdessen reicht es aus, GD anzuweisen, den Alphakanal beim Speichern beizubehalten:
Verwenden Sie die PHP-Webp-Bibliothek. siehe hier github.com/S1SYPHOS/php-webp/blob/master/README.md
– Vaibhavi S.
2. September 2019 um 13:10 Uhr
Bitte überprüfen Sie noch einmal github.com/S1SYPHOS/php-webp
– Vaibhavi S.
2. September 2019 um 13:13 Uhr
Danke, aber haben Sie eine Idee, wie Sie das Problem beheben können, ohne eine Bibliothek zu verwenden?
– Jordan Lipana
2. September 2019 um 13:25 Uhr
Nein, ich habe keine Ahnung, dies ohne Bibliothek zu implementieren.
– Vaibhavi S.
2. September 2019 um 13:29 Uhr
@JordanLipana Ich habe eine Lösung dafür. Aber es hängt von einer ausreichend hohen PHP-Version ab. Werde es in Kürze posten. Ich habe zuerst auf 5.6 getestet – nein geht. Dann auf 7.2 (Korrektur 7.3.0) – funktionierte. Ich werde meine Änderungen in 5.6 erneut überprüfen und dann die Lösung mit einem Haftungsausschluss veröffentlichen, wenn die PHP-Version von Bedeutung ist. Update: Lösung wurde gepostet.
– GetSet
24. Oktober 2019 um 1:51 Uhr