【问题标题】:PHP PNG to JPG conversion issue, image distortedPHP PNG到JPG转换问题,图像失真
【发布时间】:2012-03-26 19:35:30
【问题描述】:

我有一个使用 GD 库和 PHP 上传和调整图像大小的脚本。 我现在想上传一张 PNG 图像并将其存储为 PNG 和 JPEG,然后我将调整它的大小,但这很好。

我遇到的问题是,有时转换后的图像 (jpg) 版本会失真。其他时候还好。

我的代码取自 StackOverflow 上的另一个答案:

function png2jpg($originalFile, $outputFile, $quality){
    $image = imagecreatefrompng($originalFile);
    imagejpeg($image, $outputFile, $quality);
    imagedestroy($image);
}

扭曲结果的示例如下所示,我完全知道我不会在 JPG 上获得透明度,我只想要一个白色背景。有什么想法吗?

我不能发布图片,所以链接到原始:http://private.granvilleoil.com/prodImages/large/Petro-Patch.png) 和 JPG:http://private.granvilleoil.com/prodImages/large/Petro-Patch.jpg)

【问题讨论】:

    标签: php png gd php-5.3 jpeg


    【解决方案1】:

    您需要创建一个具有白色(或任何您想要的)背景的新图像,并将 png 中的不透明像素复制到该图像:

    function png2jpg($originalFile, $outputFile, $quality) {
        $source = imagecreatefrompng($originalFile);
        $image = imagecreatetruecolor(imagesx($source), imagesy($source));
    
        $white = imagecolorallocate($image, 255, 255, 255);
        imagefill($image, 0, 0, $white);
    
        imagecopy($image, $source, 0, 0, 0, 0, imagesx($image), imagesy($image));
    
        imagejpeg($image, $outputFile, $quality);
        imagedestroy($image);
        imagedestroy($source);
    }
    

    【讨论】:

      【解决方案2】:

      PHP 只会从 PNG 文件中复制像素,如果您的 png 具有透明度,PHP 将不会处理这将导致您在转换后看到的内容。

      【讨论】:

      • 感谢您的回复,但我不完全理解。那么我如何让 PHP 将 PNG 转换为 JPG?
      • 我的意思是您将丢失 PNG 文件中具有透明度的任何像素,您最终会得到与示例中类似的图像。这是使用 php 将 png 转换为 jpeg 的唯一方法。
      【解决方案3】:

      也许如果您尝试在白色图像上使用 png 制作图像,您可以修复此问题。

      【讨论】:

        【解决方案4】:

        JPG 格式不支持透明像素。

        相反,您可以用白色/黑色替换透明像素,然后进行转换:

        function png2jpg($originalFile, $outputFile, $quality){
            $size = getimagesize($originalFile);
            $blank = imagecreate($size[0], $size[1]);
            $newImage = imagecopymerge($blank, $originalFile, 0, 0, 0, 0, $size[0], $size[1], $quality);
            png2jpg($newImage, $outputFile, );
            $image = imagecreatefrompng($newImage);
            imagejpeg($image, $outputFile, $quality);
        }
        

        【讨论】:

          【解决方案5】:

          我在http://www.phpclasses.org/ 中遇到了一个库,它基本上是 PHP 的 GD 库的包装器。它被称为 GDImageManipulation 什么的。它是一个简单的文件类,它处理您所说的大部分初步图像操作。

          看看吧。这可能会有所帮助。

          【讨论】:

            猜你喜欢
            • 2012-01-24
            • 2012-06-01
            • 2012-01-22
            • 1970-01-01
            • 2021-06-18
            • 2013-05-10
            • 2018-01-04
            • 2012-03-21
            • 1970-01-01
            相关资源
            最近更新 更多