我正在尝试在生成PNG之前添加有关物理大小的信息以便打印。
阅读libpng文档和pHYs块规范很有帮助,但我似乎无法解决问题。
我已经尝试以最手动和简单的方式添加此块,但是.png文件最终损坏了。我错过了编码技巧吗?
对于CRC计算,我使用了this site的32位结果,并插入了下面代码给我的块的ASCII值。
阅读libpng文档和pHYs块规范很有帮助,但我似乎无法解决问题。
我已经尝试以最手动和简单的方式添加此块,但是.png文件最终损坏了。我错过了编码技巧吗?
对于CRC计算,我使用了this site的32位结果,并插入了下面代码给我的块的ASCII值。
$encoded = $_POST['imgdata'];
$encoded = str_replace(' ', '+', $encoded);
$decoded= base64_decode($encoded);
$test = explode('IDAT',$decoded);
$ppu='00000000000000000010111000100011'; //32-bit integer for the pixels per unit
$dppu=bindec($ppu);
$test[0].=sprintf("%c",bindec('00000000000000000000000000001001')) //length, also 32-bit
.'pHYs' //type
. sprintf("%c",$dppu) //Pixels per unit, x axis
. sprintf("%c",$dppu) //Pixels per unit, y axis
.'1' //Units in metres (1 byte)
. sprintf("%c", bindec(base_convert('0x0BFAAA7E', 16, 2))) //CRC (32-bit)
.'IDAT';
$fintest=implode($test);
echo $fintest;
请告诉我,像这样黑客攻击是否有可能成功。我也不确定我的32位整数:像我这样用零填充它们是使它们成为32位的正确方法吗?
explode
和implode
是否执行我猜测的操作:仅对IDAT
块进行解压缩和重新压缩?那是错误的:pHYs
是一个单独的块,与压缩的IDAT
无关。 - Jongware