【发布时间】:2011-07-21 06:55:31
【问题描述】:
我有一个带有 128 字节标题的图像文件,后面是原始 RGBA 数据,宽度和高度存储在偏移量 72 和 74 处作为短整数(大端)。我已经成功地能够读取标题,但是,我需要一种将原始 RGBA 保存为 PNG 格式和/或 GIF 的方法。我怎样才能在 PHP 中做到这一点?
干杯
【问题讨论】:
我有一个带有 128 字节标题的图像文件,后面是原始 RGBA 数据,宽度和高度存储在偏移量 72 和 74 处作为短整数(大端)。我已经成功地能够读取标题,但是,我需要一种将原始 RGBA 保存为 PNG 格式和/或 GIF 的方法。我怎样才能在 PHP 中做到这一点?
干杯
【问题讨论】:
如果你安装了 gd 库(检查 phpinfo(); )它就像
//create image
$img = imagecreatetruecolor($width, $height);
//fill by iterating through your raw pixel data
imagesetpixel($img, $x, $y, $color);
//output
header("Content-Type: image/png");
imagepng($img);
//cleanup
imagedestroy($img);
编辑
你说它是 RGBA 数据。假设每个通道标准 4 个字节并且您的原始数据是一个整数数组,它应该是:
$pos = ($y * $width + $x) * 4 + ($headerLengthInBytes / 4);
$red = $rawImageData[$pos];
$green = $rawImageData[$pos + 1];
$blue = $rawImageData[$pos + 2];
$alpha = $rawImageData[$pos + 3];
【讨论】:
imagecolorat(),但该功能需要一个图像处理程序,而我没有。有什么建议吗?
$pos = ($y * $width + $x) * 4; list($red, $green, $blue, $alpha) = array_values(unpack("C4", substr($buffer, $pos, $pos+4)));
虽然您可以自己从源流中生成未压缩的 PNG,但这需要付出很多努力。 (需要手工制作 png32 标头,并写出未压缩的 deflate 块,因为 PNG 本身不支持未压缩的有效负载)。
使用 imagemagick 更容易。只需将原始 RGBA 流写入临时文件并使用:
file_put_contents("tmp.rgba", susbstr($data, 128));
exec("convert -size 640x300 -depth 8 tmp.rgba output.png");
【讨论】:
我会看看gd 或imagemagick,其中一个或两个应该可以解决问题
【讨论】: