【问题标题】:Reduce size of png image without losing transparency在不丢失透明度的情况下减小 png 图像的大小
【发布时间】:2015-08-30 15:12:30
【问题描述】:

我正在尝试通过使用以下函数来减小图像大小。但是当我使用具有透明度的图像时,此功能会以透明像素重复图像并产生扭曲。 如何在不丢失透明度的情况下减少 png 图像?

 function compress($source, $destination, $quality) 
 { 
     $info = getimagesize($source); 
     if ($info['mime'] == 'image/jpeg') 
        $image = imagecreatefromjpeg($source); 
     else if ($info['mime'] == 'image/gif') 
        $image = imagecreatefromgif($source); 
     else if ($info['mime'] == 'image/png') 
        $image = imagecreatefrompng($source); 

     imagejpeg($image, $destination, $quality); 
     return $destination; 
 } 

 $source_img = 'source.png'; 
 $destination_img = 'destination.png'; 
 $d = compress($source_img, $destination_img, 90); 

【问题讨论】:

  • 请阅读有关 imagecolortransparent 的更多信息
  • 除非我非常不擅长阅读 PHP(这完全可能),否则您总是使用 imagejpeg() 将所有内容转换为 JPEG 格式,因此您将始终失去透明度,因为 JPEG 不支持透明度。
  • 那么如何减小 png 图片尺寸?
  • 我不知道,但我认为您可以将 png 保存为 8 位和 24 位的东西....可能会给出不同的尺寸,干杯

标签: php image


【解决方案1】:

更改并添加几行到您的压缩函数:

function compress($source, $destination, $quality) 
{ 
    $info = getimagesize($source); 
    if ($info['mime'] == 'image/jpeg') 
       $image = imagecreatefromjpeg($source);
       imagejpeg($image, $destination, $quality); //Compress with jpg
    else if ($info['mime'] == 'image/gif') 
      $image = imagecreatefromgif($source); 
    else if ($info['mime'] == 'image/png') 
      $image = imagecreatefrompng($source); 
      imagepng($image, $destination, $quality); //Compress with png !!


   return $destination; 
} 

$source_img = 'source.png'; 
$destination_img = 'destination.png'; 
$d = compress($source_img, $destination_img, 90); 

重要的是要理解为什么图像在 png 时会变成黑色背景,这是由于透明度。 JPEG 格式不允许您拥有具有透明度的图像,只有 PNG 格式支持它,因此在每种情况下都调用正确的函数。

这个脚本应该可以正常工作,如果以前可以工作的话。请尝试一下。

【讨论】:

  • 我试了一下,但它没有保存图像的透明度
猜你喜欢
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 2016-08-10
相关资源
最近更新 更多