PHP中使用Imagick调整并压缩JPG后如何获取文件字节长度?
解决Imagick缩放/压缩后
getImageLength()返回0的问题 问题根源很明确:getImageLength()返回的是Imagick已经编码到内存中的图像数据字节数。你执行缩放、修改压缩参数这些操作时,只是修改了图像对象的属性,并没有实际生成对应的编码数据,所以内存里没有这部分内容,自然返回0。
解决方法
要获取缩放/压缩后的字节长度,必须先触发Imagick的编码操作,让它把修改后的图像转换成对应格式的二进制数据,之后再读取长度。
1. 获取缩放后的字节长度
在调用getImageLength()前,先调用getImageBlob()(会返回编码后的二进制数据)或者writeImageBlob()(仅执行编码,不返回数据)触发编码:
if($original_width > 300) { $im->scaleImage(300, 0); // max size for images is 300px wide } // 触发编码,生成缩放后的图像数据 $im->getImageBlob(); // 现在可以正确获取长度 $scaled_length = $im->getImageLength(); // 或者直接用strlen($im->getImageBlob()),效果一致 // $scaled_length = strlen($im->getImageBlob());
2. 获取压缩后的字节长度
设置压缩参数后,同样需要触发编码再读取长度:
$compression_quality = 20; $im->setImageCompression(Imagick::COMPRESSION_JPEG); $im->setImageCompressionQuality($compression_quality); // 触发编码,生成压缩后的图像数据 $im->getImageBlob(); $compressed_length = $im->getImageLength(); // 或者用strlen($im->getImageBlob())
关于限制缩略图文件大小的补充
如果要确保缩略图大小不超过某个阈值,固定压缩质量可能不够(不同图像压缩率差异大),可以做循环调整:
$max_file_size = 10240; // 10KB $quality = 80; $im->setImageCompression(Imagick::COMPRESSION_JPEG); do { $im->setImageCompressionQuality($quality); $compressed_data = $im->getImageBlob(); $compressed_length = strlen($compressed_data); $quality -= 5; // 每次降低5个质量等级 } while ($compressed_length > $max_file_size && $quality > 5); // 最后得到符合大小要求的图像数据
内容的提问来源于stack exchange,提问作者johnnyApplePRNG
相关产品推荐
相关产品推荐

