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


PHP PNG to JPG conversion issue, image distorted

我有一个脚本,可以使用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)

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

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

如果你试图在白色图像上制作一个png图像,你可以修复这个问题。

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

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

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