2010-04-10 14 views
34

Tworzę miniatury przy użyciu biblioteki PHP i GD, ale mój kod zmienia przezroczystość na png w jednolity czarny kolor. Czy istnieje rozwiązanie pozwalające ulepszyć mój kod?imagecreatefrompng() Czy czarne tło zamiast przezroczystego?

to jest mój php kod ekspres miniatur:

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

Dziękuję

+0

skorzystać z poniższego poradnika dla obrazu kadrowanie http://stackoverflow.com/questions/43409133/solved-png-image-issue-php-background-black-backround-on-resized-images –

Odpowiedz

66

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

    case 'png': 
     // 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; 

// ... 
+1

Próbowałeś umieścić znaczniki php wokół kodu? – zaf

+0

W celu wyjaśnienia, w powyższym kodzie, '$ simage' jest wynikiem działania' imagecreatetruecolor' –

+1

, który pracował dla mnie dla pngs, ale gify wciąż mają czarne tło; również nie rozumiem wartości drugiego zdania "png". Czy to konieczne? Próbowałem zi bez i nie widziałem żadnej różnicy. –

3

Czasami, jeśli obraz .jpg dostał małe błędy wewnątrz (nie można patrz), wszystkie przezroczyste piksele zmieniają kolor na czarny. Spróbuj użyć:

ini_set('gd.jpeg_ignore_warning', 1); 
0

zmiana rgb na 255, da obraz przezroczysty, a nie czarny.

<?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; 
} 
?> 
4

jeśli kod poprawnej odpowiedzi nie działa spróbuj tego:

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

Dla niektórych obrazów należy najpierw wypełnić tło przezroczystym, nieparzystym, ale działa –

8

Kolejność operacji jest bardzo ważne. dla obrazów .gif stwierdziłem, że najpierw trzeba skopiować obraz o zmienionym rozmiarze, a następnie ustawić czarne tło jako przezroczyste. w przypadku PNG znalazłem kod poniżej rozmiarów obrazów i zachowałem tła przezroczystości.

również, ten kod działa dla mnie ...

$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; 
} 
2

Oto mój całkowity kod testowy. To działa na mnie

$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); 
Powiązane problemy