我有一个脚本,可以使用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之类的。它是一个简单的单文件类,它处理您正在讨论的大多数初步图像操作。
看看它。它可能会有所帮助。