PHP PNG到JPG转换问题,图像失真

时间:2012-03-09 10:32:23

标签: php png gd php-5.3 jpeg

我有一个使用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

5 个答案:

答案 0 :(得分:2)

您需要使用白色(或任何您想要的)背景创建一个新图像,并将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);
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我在http://www.phpclasses.org/中遇到了一个库,它基本上是PHP的GD库的包装器。它被称为GDImageManipulation或其他东西。它是一个简单的文件类,它处理您正在谈论的大多数初步图像操作。

看看它。这可能有所帮助。

相关问题