2010-04-10 41 views
34

Tôi tạo hình thu nhỏ bằng cách sử dụng thư viện PHP và GD nhưng mã của tôi biến tính minh bạch png thành màu đen đặc, Có giải pháp để cải thiện mã của tôi không?imagecreatefrompng() Tạo nền đen thay vì trong suốt?

này là php mã của tôi nhà sản xuất thu nhỏ:

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

Cảm ơn bạn

+0

Sử dụng dưới đây hướng dẫn cho hình ảnh cắt xén http://stackoverflow.com/questions/43409133/solved-png-image-issue-php-background-black-backround-on-resized-images –

Trả lời

66

Sau 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

Bạn đã thử đặt các thẻ php xung quanh mã? – zaf

+0

Chỉ cần làm rõ, trong đoạn mã trên, '$ simage' là đầu ra từ' imagecreatetruecolor' –

+1

làm việc cho tôi cho png, nhưng gifs vẫn có nền đen; cũng không hiểu giá trị của câu lệnh png 'case' thứ hai. Điều đó có cần thiết không? Tôi đã thử và không nhìn thấy sự khác biệt. –

3

Đôi khi nếu hình ảnh .jpg có lỗi nhỏ bên trong (bạn có thể không thấy rằng), tất cả các pixel trong suốt đều chuyển sang màu đen. Thử sử dụng:

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

thay đổi rgb thành 255, nó sẽ cho bạn hình ảnh trong suốt, thay vào đó là màu đen.

<?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

nếu mã của câu trả lời đúng không làm việc cố gắng này:

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

Đối với một số hình ảnh, bạn cần phải điền vào nền với transparant đầu tiên, lẻ, nhưng đã làm việc –

8

Trình tự hoạt động là rất quan trọng. cho hình ảnh .gif tôi thấy rằng tôi cần phải sao chép hình ảnh đã thay đổi kích cỡ trước, sau đó gán nền đen như trong suốt. đối với PNG, tôi đã tìm thấy mã bên dưới hình ảnh đã được thay đổi kích thước và giữ nguyên hình nền trong suốt.

cũng có, mã này làm việc cho tôi ...

$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

Dưới đây là tổng mã kiểm tra của tôi. Nó làm việc cho tôi

$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); 
Các vấn đề liên quan