PHP修改PNG图片DPI

最近使用PHP生成图片用于打印,但是浏览器默认输出为72DPI,打印要求为300DPI,如果直接打印,图片会比较模糊。

在网上找了一圈,大部分链接都指向ImageMagick,但是我的项目部署在新浪SAE,新浪SAE不支持它。继续找,发现了《PHP 使用GD函式庫更改圖片DPI》这篇文章,提供了修改JPG图片分辨率的方法,亲测可行。但是我的项目必须使用PNG图片,因为用的是透明背景,所以上面的方法还不行,但是可以参考思路。后来又找到了另外一篇文章《PHP: Dpi of a png image》,这篇文章提供了获取PNG图片分辨率的方法,遗憾的是作者并没有给出设置分辨率的方法。

最后,被逼无奈,硬着头皮自己写啦,挣扎一番终于成功了。这是我写的测试例子:

 

 0) {
	//修改pHYs数据块
	$file = substr_replace($file, $phys, $pos - 4, 21);
} else {
	//IHDR结束位置(PNG头固定长度为8,IHDR固定长度为25)
	$pos = 33;
	//将pHYs数据块插入到IHDR之后
	$file = substr_replace($file, $phys, $pos, 0);
}

header("Content-type: image/png");
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
echo $file;
?>

这篇文章应该也可以作为《各位兄弟姐妹,php 怎么可以生成一张300分辨率的图片,谢谢》的一个答案。

本文参考的其他资料:

  • 《W3C PNG Specification》
  • 《png文件的数据结构》
  • 《分析PNG图像文件结构(3)》

在网上搜索的过程中还遇到了一些有用的资料,也放在这里吧:

  • 《JavaScript修改Canvas图片的分辨率(DPI)》
  • 《PNG设置分辨率》(使用了Linux函数png_set_pHYs)

最后说一句,有条件还是使用ImageMagick,没必要这么折腾!

你可能感兴趣的:(PHP)