在 php 中附加一个 png pHYs 块

Ale*_*lex 5 php binary png chunks

我正在尝试添加一些有关物理尺寸的信息,以便在生成 PNG 之前打印它们。

阅读libpng 文档和 pHYs 块规范很有帮助,但我似乎无法破解它。

我尝试以最手动和最简单的方式添加这个块,但是,.png 文件最终损坏了。我错过了编码技巧吗?

对于 CRC 计算,我使用了这个站点的 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;
Run Code Online (Sandbox Code Playgroud)

请让我知道像这样入侵它是否可行。我也不确定我的 32 位整数:是零填充它们,因为我正在做使它们成为 32 位的正确方法吗?

Ale*_*lex 2

在花了一天时间之后,我发现做到这一点的方法是逐字节翻译所有内容。按照文档,该pHYs块需要:

  • 块(仅数据)长度为 4 个字节
  • 块类型 4 个字节(字符“pHYs”)
  • 9 个字节用于块数据:4 个字节用于 x 和 y 密度,1 个字节用于单位选择
  • 4 个字节用于 CRC

我将所有这些写成二进制字符串,并根据需要用 0 填充字节。然后事实证明,该chr()函数正确地对其进行了编码以在 PNG 文件中使用,这与sprintf("%c",$string)我在问题中使用的方法不同。这是代码

$encoded = $_POST['imgdata'];
$encoded = str_replace(' ', '+', $encoded);
$decoded=  base64_decode($encoded);

$binstring='00000000000000000000000000001001' //4-byte length
        . '01110000010010000101100101110011' //4-byte type or 'pHYs'
        . '000000000000000000101110001000110000000000000000001011100010001100000001' //9-byte data
        . base_convert('0x0BFAAA7E', 16, 2); //4-byte CRC
foreach (str_split($binstring,8) as $b) {
    $on.=chr(bindec($b));
}
Run Code Online (Sandbox Code Playgroud)

然后 $on 变量被附加到IDAT块长度的 4 个字节之前的位置。