我正在尝试压缩PNG文件,直到我使用dirty-ish方法达到目标标记。但我正在努力让任何压缩进行。我知道在最后一点,我将压缩设置为0,但这是因为我希望文件已被压缩。
1)上传带有表格
的png2)当尺寸大于25000时,将其压缩5(imagepng())
我需要使用缓冲区重新捕获图像而不是不断保存它(我认为这是一个好方法)。以下代码不是我的生产代码,但它是确切的方法。
$postedImg = $_FILES['file']['tmp_name'];
$size = filesize($postedImg); // eg 35000
$info = getimagesize($postedImg);
$mime = $info['mime'];
if($mime === 'image/png')
$img = imagecreatefrompng($postedImg);
while($size > 25000){
ob_start();
imagepng($img , NULL, 5);
$obImgStr = ob_get_contents();
$img = imagecreatefromstring($obImgStr);
ob_end_clean();
$size = filesize($obImgStr);
}
imagepng($img, 'image/goes/here.png', 0);
答案 0 :(得分:2)
PNG压缩无损。如果你将它压缩到5,然后再压缩到5,那么你最终会将其压缩为5。同样地,当你最终将图像输出为0时(只有当你第一次尝试5点击到25k时才会出现),你实际做的是撤消你刚才做的任何压缩。这是因为压缩不会影响图像的质量(该选项的文档名称具有误导性)。它就像一个拉链...它所做的只是减小文件大小,缺点是文件需要在另一端重新充气。
更好的方法是逐步压缩它,从例如开始1,然后2,然后3,直到你得到你想要的大小。即便如此,正如上面的评论所说,你可能永远无法达到你的目标规模。