我使用的是firebug页面速度实用程序,其中一个建议是压缩图像 - 所以我编写了以下代码来压缩图像
$filename="http://localhost.com/snapshots/picture.png"; $img = imagecreatefrompng($filename); $this->_response->setHeader('Content-Type', 'image/png'); imagepng($img,null,9); imagedestroy($img);
现在实际图像尺寸为154K 所以我通过给出不同的质量水平进行实验,这就是我找到的
imagepng($img,null,0); --> Size = 225K imagepng($img,null,1); --> Size = 85.9K imagepng($img,null,2); --> Size = 83.7K imagepng($img,null,3); --> Size = 80.9K imagepng($img,null,4); --> Size = 74.6K imagepng($img,null,5); --> Size = 73.8K imagepng($img,null,6); --> Size = 73K imagepng($img,null,7); --> Size = 72.4K imagepng($img,null,8); --> Size = 71K imagepng($img,null,9); --> Size = 70.6K
这些结果看起来是否准确 - 我不确定质量为0的原因 - 图像尺寸大于实际尺寸。
其次,这是在PHP中将图像压缩到浏览器之前压缩图像以提高性能的最佳方式。
基于这些建议,最好在保存时压缩图像一次 - 我挖掘了闪存程序调用的代码以生成快照 -
$video = $this->_getParam('video'); $imgContent = base64_decode($this->_getParam('snapshot')); file_put_contents("snapshots/" . $video . ".png", $imgContent);
EDITED 的 基于Alvaro的建议,我对代码进行了以下修改,生成了一个很小的jpg文件
$video = $this->_getParam('video'); $imgContent = base64_decode($this->_getParam('snapshot')); file_put_contents("snapshots/" . $video . ".png", $imgContent); $filename="snapshots/".$video.".png"; $img = imagecreatefrompng($filename); imagejpeg($img,'test.jpg',75);
所以现在这是一个3步骤的过程
这是最好的解决方法。
答案 0 :(得分:4)
由于PNG使用无损数据压缩,因此在PNG图像(边缘情况分开)中实现适当压缩的唯一方法是将其保存为调色板(而不是真彩色)并减少颜色数量。您似乎正在处理某种屏幕截图。如果使用有损压缩,即可以保存为JPEG,则可以获得较小的文件大小。在任何一种情况下,都可以减小文件大小和图像质量。您也可以尝试使用GIF格式,对于小图表,这种格式往往较小。
最后但并非最不重要的一点是,您应该压缩图像一次(通常是在上传时),而不是每次都要压缩图像。我想你的代码只是一个快速测试,但我提到以防万一。
回答更新后的问题:
我不熟悉PHP图像功能,但您应该使用imagecreatefrompng()和imagejpeg()的组合。另外,请考虑是否需要保留原始PNG以供将来参考,或者您可以将其丢弃。
答案 1 :(得分:3)
你还没有理解最后一个参数,那就是质量不是压缩等级,所以增加它会减小图像尺寸。无论如何,我之前使用过这种方法来压缩png图像并且效果很好所以我认为你应该继续使用它。
答案 2 :(得分:0)
1-结果似乎准确,因为0
表示无压缩
质量
压缩级别:从0开始(没有 压缩)到9。
0
ed文件大于原始文件(可以稍微压缩开始)是正常的。您需要了解文件压缩和PHP GD图像构造函数。
2-恕我直言,最明智的选择是在你的服务器上传之前压缩你的png文件(当然,只有你有选择时才会说明:静态,少量文件)。
帮助:
如果它意味着是动态的,那么php就是选择。