在使用php GD库时,遇到这样一个报错。
message 'imagecreatefrompng(): gd-png: fatal libpng error: IDAT: CRC error'
“致命图像错误,CRC错误。”
没有在图片领域有过研究,并不知道CRC是什么。这里不会专门介绍CRC,也不会介绍图片格式。需要了解可以自行查资料。
猜想一
首先我认为是图片不能正常打开的问题。但事实上,所有图片均能正常打开,可以浏览。
猜想二
是否有可能是,图片后缀修改造成的影响?因为我知道,一张.png。后缀的图片,修改成.jpg后是能正常浏览的。
实践发现,处理的图片中确实存在,png后缀的图被修改成了jpg。getimagesize();
可以查看到图片的真实后缀。
为了证明是否因为修改后缀造成的影响。我做了以下实验。
- 将错误图片,后缀恢复成jpg。再执行代码验证。
- 使用正常图片来执行代码,之后修改正常图片后缀,再执行代码验证。
实验结果。
- 错误图片恢复成jpg后,仍然报错。
- 正常图片能成功执行代码,修改后缀名后扔能正常执行代码。
因此证明报错的原因并非因为修改后缀名引起。
猜想三
束手无策后,我把问题归于GD库imagecreatefrompng
,imagecreatefromjpeg
的兼容性是否不够好。
之后我修改代码,使用php中非常强大的函数file_get_content
搭配imagecreatefromstring
,来完成图片重建。
因为我认为,将图片读取成字符串之后,就不会因为不同后缀的图片格式引起兼容问题。
但是仍然报错
message 'imagecreatefromstring(): gd-png: fatal libpng error: IDAT: CRC error'
发现问题
在折腾了两个多小时之后。我把目光放到CRC上。
循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。
原来在使用imagecreatefrom* 系列函数时,为了防止png图片中包含恶意代码。php会在调用函数时,先使用CRC对图片进行校验。
而我使用的错误图片,确实出现了错误。
原来图片,在使用ps操作时。修改成jpg格式过程中。产生了问题。而这个问题,并没有影响图片的正常浏览。
因此,在php处理该图片crc校验时,任务这是一个可能包含恶意代码的图片,然后抛出错误。
最后,为了避免这样类似的问题发生。图片处理时,尽量避免直接修改后缀。