webentwicklung-frage-antwort-db.com.de

imagecreatefrompng () Macht einen schwarzen Hintergrund statt transparent?

Ich mache Thumbnails mit PHP und der Gd-Bibliothek, aber mein Code verwandelt png-Transparenz in eine durchgehende schwarze Farbe. Gibt es eine Lösung, um meinen Code zu verbessern?

dies ist mein PHP-Thumbnail-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);
}

Vielen Dank

38
Emily

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;

// ...
75
Adrian

Die Reihenfolge der Operationen ist wichtig. Für .gif-Bilder habe ich festgestellt, dass ich das verkleinerte Bild zuerst kopieren und dann den schwarzen Hintergrund als transparent zuweisen muss. Für PNGs habe ich den untenstehenden Code in der Größe geändert und die Transparenzhintergründe beibehalten.

dieser Code hat auch für mich 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;
}
9
pgee70

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

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

Wenn das JPG-Bild kleine Fehler enthält (Sie können das nicht sehen), werden alle transparenten Pixel schwarz. 

ini_set('Gd.jpeg_ignore_warning', 1);
3
Stone

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);
3

Einige der oben genannten Punkte ließen die schwarzen Teile des Bildes weiß werden, während andere überhaupt nicht funktionierten. Dies hat jedoch für mich funktioniert https://github.com/claviska/SimpleImage/issues/28

0
Aba

wenn Sie rgb auf 255 ändern, erhalten Sie ein transparentes und kein schwarzes Bild.

<?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;
}
?>
0
Basit