imagecreatefrompng() Macht einen schwarzen Hintergrund statt transparent?

Lesezeit: 4 Minuten

Ich erstelle Thumbnails mit der PHP- und GD-Bibliothek, aber mein Code verwandelt PNG-Transparenz in eine durchgehend schwarze Farbe. Gibt es eine Lösung, um meinen Code zu verbessern?

Dies ist mein PHP-Thumbnail-Maker-Code:

function cropImage($nw, $nh, $source, $stype, $dest) {
     $size = getimagesize($source);
     $w = $size[0];
      $h = $size[1];

      switch($stype) {
          case 'gif':
          $simg = imagecreatefromgif($source);
          break;
          case 'jpg':
          $simg = imagecreatefromjpeg($source);
          break;
          case 'png':
          $simg = imagecreatefrompng($source);
          break;
      }

      $dimg = imagecreatetruecolor($nw, $nh);
      $wm = $w/$nw;
      $hm = $h/$nh;
      $h_height = $nh/2;
      $w_height = $nw/2;

      if($w> $h) {
          $adjusted_width = $w / $hm;
          $half_width = $adjusted_width / 2;
          $int_width = $half_width - $w_height;
          imagecopyresampled($dimg,$simg,-$int_width,0,0,0,$adjusted_width,$nh,$w,$h);
      } elseif(($w <$h) || ($w == $h)) {
          $adjusted_height = $h / $wm;
          $half_height = $adjusted_height / 2;
          $int_height = $half_height - $h_height;

          imagecopyresampled($dimg,$simg,0,-$int_height,0,0,$nw,$adjusted_height,$w,$h);
      } else {
          imagecopyresampled($dimg,$simg,0,0,0,0,$nw,$nh,$w,$h);
      }

      imagejpeg($dimg,$dest,100);
}

Danke

imagecreatefrompng Macht einen schwarzen Hintergrund statt transparent
Adrian

Nach imagecreatetruecolor():

<?php

// ... Before imagecreatetruecolor()

$dimg = imagecreatetruecolor($width_new, $height_new); // png ?: gif

// start changes
switch ($stype) {

    case 'gif':
    case 'png':
        // integer representation of the color black (rgb: 0,0,0)
        $background = imagecolorallocate($dimg , 0, 0, 0);
        // removing the black from the placeholder
        imagecolortransparent($dimg, $background);

        // turning off alpha blending (to ensure alpha channel information
        // is preserved, rather than removed (blending with the rest of the
        // image in the form of black))
        imagealphablending($dimg, false);

        // turning on alpha channel information saving (to ensure the full range
        // of transparency is preserved)
        imagesavealpha($dimg, true);
        break;

    default:
        break;
}
// end changes

$wm = $w/$nw;
$hm = $h/$nh;

// ...

  • Nur zur Verdeutlichung, im obigen Code, $simage ist die Ausgabe von imagecreatetruecolor

    – Iván Rodríguez Torres

    1. Juni 2016 um 12:07 Uhr

  • hat bei mir für PNGs funktioniert, aber GIFs haben immer noch einen schwarzen Hintergrund; Verstehe auch nicht den Wert der zweiten ‘png’-Anweisung. Ist das notwendig? Ich habe es mit und ohne versucht und keinen Unterschied festgestellt.

    – Alec Smythe

    13. September 2017 um 9:36 Uhr

  • Und nach fast 9 Jahren ist das gleiche Problem immer noch da … und die obige Lösung hilft nicht … Irgendwelche anderen Vorschläge?

    – Toma Tomow

    2. Oktober 2018 um 6:44 Uhr

Wenn der Code der richtigen Antwort nicht funktioniert, versuchen Sie Folgendes:

    //After imagecreatetruecolor():
$white = imagecolorallocate($dimg, 255, 255, 255); 
imagefill($dimg,0,0,$white); 

  • Bei manchen Bildern müssen Sie den Hintergrund zuerst transparent füllen, ungerade, aber funktionieren

    – PugganSe

    31. Oktober 2016 um 12:28 Uhr


Die Reihenfolge der Operationen ist wichtig. Bei .gif-Bildern musste ich zuerst das verkleinerte Bild kopieren und dann den schwarzen Hintergrund als transparent zuweisen. Für PNGs habe ich den Code unter den verkleinerten Bildern gefunden und die transparenten Hintergründe beibehalten.

Auch dieser Code hat bei mir funktioniert …

$resized_image = imagecreatetruecolor($target_width, $target_height);
switch ( $asset->a_mime_type )
{
    case 'image/jpeg':
        imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height);
        $r = imagejpeg($resized_image,$file_name);
        break;
    case 'image/png':
        imagealphablending($resized_image, FALSE);
        imagesavealpha($resized_image, TRUE);
        imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height);
        $r = @imagepng($resized_image,$file_name);
        break;
    case 'image/gif':
        imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height);
        $background = imagecolorallocate($resized_image, 0, 0, 0); 
        imagecolortransparent($resized_image, $background);
        $r = @imagegif($resized_image,$file_name);
        break;
}

1646266446 5 imagecreatefrompng Macht einen schwarzen Hintergrund statt transparent
Stein

Manchmal, wenn das .jpg-Bild kleine Fehler enthält (das können Sie nicht sehen), werden alle transparenten Pixel schwarz. Versuchen Sie Folgendes zu verwenden:

ini_set('gd.jpeg_ignore_warning', 1);

Fügen Sie einfach diese Zeile hinzu:

imagesavealpha($image, true);

Vor

imagepng($image)

imagecreatefrompng Macht einen schwarzen Hintergrund statt transparent
Md. Imadul Islam

Hier ist mein gesamter Testcode. Für mich geht das

$imageFileType = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION);
$filename="test." . $imageFileType;
move_uploaded_file($_FILES["image"]["tmp_name"], $filename);

$source_image = imagecreatefromjpeg($filename);

$source_imagex = imagesx($source_image);
$source_imagey = imagesy($source_image);

$dest_imagex = 400;
$dest_imagey = 600;
$dest_image = imagecreatetruecolor($dest_imagex, $dest_imagey);

imagecopyresampled($dest_image, $source_image, 0, 0, 0, 0, $dest_imagex, $dest_imagey, $source_imagex, $source_imagey);

imagesavealpha($dest_image, true);
$trans_colour = imagecolorallocatealpha($dest_image, 0, 0, 0, 127);
imagefill($dest_image, 0, 0, $trans_colour);

imagepng($dest_image,"test1.png",1);

1646266447 816 imagecreatefrompng Macht einen schwarzen Hintergrund statt transparent
Bast

ändern Sie rgb auf 255, es wird Ihnen ein transparentes Bild geben, anstatt schwarz.

<?php
switch ($stype)
{
    case "png":
        // integer representation of the color black (rgb: 0,0,0)
        $background = imagecolorallocate($simage, 255, 255, 255);
        // removing the black from the placeholder
        imagecolortransparent($simage, $background);

        // turning off alpha blending (to ensure alpha channel information is preserved, rather than removed (blending with the rest of the image in the form of black))
        imagealphablending($simage, false);

        // turning on alpha channel information saving (to ensure the full range of transparency is preserved)
        imagesavealpha($simage, true);

        break;
    case "gif":
        // integer representation of the color black (rgb: 0,0,0)
        $background = imagecolorallocate($simage,  255, 255, 255);
        // removing the black from the placeholder
        imagecolortransparent($simage, $background);

        break;
}
?>

917610cookie-checkimagecreatefrompng() Macht einen schwarzen Hintergrund statt transparent?

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

Privacy policy