php gd读取原始像素数据

时间:2011-03-27 02:02:34

标签: php gd reverse-engineering pixel

我有以下php脚本:

<?php
class GimFile {
    public $data = '';
    public $header = '';
    public $rgba = '';
    public $width = 0;
    public $height = 0;
    public function __construct($imagedata) {
        $this->data = $imagedata;
        if (substr($this->data, 1, 3) != 'GIM') {
            exit("This data is not in GIM format");
        }

        $this->header = substr($this->data, 0, 128);
        $this->rgba = substr($this->data, 128);

        // PHP can't unpack signed short from big-endian
        // so we unpack it as unsigned, and subtract 2^16 if >2^15
        $dimensions = array_values(unpack("n2", substr($this->header, 72, 76)));
        for($i = 0; $i < count($dimensions); $i++) {
            if($dimensions[$i] >= pow(2, 15)) {
                $dimensions[$i] -= pow(2, 16);
            }
        }

        list($this->width, $this->height) = $dimensions;
    }
    public function save($dest) {
        //create image
        $img = imagecreatetruecolor($this->width, $this->height);
        //fill by iterating through your raw pixel data
        for($x = 0; $x < $this->width; $x++) {
            for($y = 0; $y < $this->height; $y++) {
                $pos = ($y * $this->width + $x) * 4;
                list($red, $green, $blue, $alpha) = array_values(unpack("C4", substr($this->rgba, $pos, $pos+4)));
                $alpha >>= 1; // alpha transprancy is saved as 8bit, we need 7 bit
                $color = imagecolorallocatealpha ( $img, $red, $green, $blue, $alpha );
                imagesetpixel($img, $x, $y, $color);
            }
        }
        imagepng($img, $dest);
        imagedestroy($img);
    }
}

header('Content-type: image/png');
$contents = file_get_contents('gim');
$gim = new GimFile($contents);
$gim->save('lol.png');

?>

它应该读取原始二进制数据作为参数,并将其保存为.png文件。此数据包含以下内容:
前128个字节是标题,其中偏移量72和74分别包含宽度和高度(带符号的短大端)。此数据在构造函数中进行解析。其余数据是原始RGBA数据 保存功能,遍历原始RGBA数据(迭代每个像素),查找颜色,并写入相同宽度和高度的新图像。然后将其保存到文件中 但是,由于某种原因,结果是错误的。

使用包含所需数据的以下文件:http://2971.a.hostable.me/gim/gim
预计会有以下png:http://2971.a.hostable.me/gim/expected.png
生成以下png:http://2971.a.hostable.me/gim/output.png

最接近我的预期结果是将$ alpha设置为0,但结果是:http://2971.a.hostable.me/gim/noalpha.png

任何人都可以帮助修复脚本以产生预期结果吗?

提前致谢。

Hosh

1 个答案:

答案 0 :(得分:1)

而不是图像我有消息'图像“http://localhost/gim/gim.php”无法显示,因为它包含写在PNG画布上的错误'。我使用了 gim 文件( 65,393字节)并在localhost上测试了您的脚本(具有GD库支持)。此外,输出文件lol.png看起来像彩虹(宽度:128px,高度:128px,bitdepth:24)。你确定这是正确的代码(不是你的修改不起作用)吗?我想提供帮助,但无法理解' gim '格式。

P.S。 gim.php是我的php脚本,我将你的代码放在.host中的./gim文件夹中。

告诉我一些事情,如果你使用4个字节来编码128x128图像中的每个像素...原始数据必须至少为65,536字节+标题...所以另一个问题,如果这个代码是正确的,那么什么是错的'gim'文件,因为它只有65,393字节?