So konvertieren Sie eine PNG-Datei in eine Webp-Datei

Lesezeit: 5 Minuten

Benutzeravatar von Jordan Lipana
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.

Das ist mein PHP-Code:

$type = wp_check_filetype($file, null);
$ext = $type['ext'];
if ($ext === 'png') {
    $im = imagecreatefrompng($file);
    imagepalettetotruecolor($im);
    $webp = imagewebp($im, str_replace('png', 'webp', $file));
}
imagedestroy($im);

Die PHP-Version ist 5.6

  • 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


Benutzeravatar von GetSet
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.

Verknüpfung:

https://github.com/libgd/libgd

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

Benutzeravatar von DubVader
DubVader

Möglicherweise müssen Sie den Alphakanal aktivieren und speichern. Versuchen Sie vielleicht Folgendes:

$ext = $type['ext'];
if ($ext === 'jpg' || $ext === 'jpeg') {
    $im = imagecreatefromjpeg($file);
    $webp = imagewebp($im, str_replace($ext, 'webp', $file), 70);
} elseif ($ext === 'png') {
    $im = imagecreatefrompng($file);
    imagepalettetotruecolor($im);

    imageAlphaBlending($im, true); // alpha channel
    imageSaveAlpha($im, true); // save alpha setting

    $webp = imagewebp($file, str_replace('png', 'webp', $file));
}
imagedestroy($im);

Die PHP-Version ist 5.6

  • 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:

$im = imagecreatefrompng($infilename);
imagesavealpha($im, true);
imagewebp($im, $outfilename);

einfach hinzufügen :

imagealphablending($im, true);
imagesavealpha($im, true);

zwischen $im = imagecreatefrompng($file); und imagewebp(..

$type = wp_check_filetype($file, null);
$ext = $type['ext'];
if ($ext === 'png') {
  $im = imagecreatefrompng($file);
  imagealphablending($im, true);
  imagesavealpha($im, true);
  $webp = imagewebp($im, str_replace('png', 'webp', $file));
}
imagedestroy($im);

stell das bild irgendwo hin wie:

<html>
  <body style="background-color:red;">
    <img src="https://stackoverflow.com/questions/57757439/url_of_your_img.webp">
  </body>
</html>

und Sie sollten Ihr Webp richtig sehen

1387100cookie-checkSo konvertieren Sie eine PNG-Datei in eine Webp-Datei

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy