PHP 将原始 RGBA 保存为 PNG/GIF

发布于 2024-10-25 21:12:56 字数 150 浏览 5 评论 0原文

我有一个图像文件,带有 128 字节标头,后跟原始 RGBA 数据,宽度和高度作为短整数(大端)存储在偏移量 72 和 74 处。我已经成功地读取了标题,但是,我需要一种方法将原始 RGBA 保存为 PNG 格式和/或 GIF。我怎样才能在 PHP 中做到这一点?

干杯

I have an image file, with a 128 byte header, followed by raw RGBA data and the width and height are stored at offset 72 and 74 as short ints (big endian). I have successfully been able to read the header, however, I need a way to save the raw RGBA as PNG format and/or GIF. How can I do that in PHP?

cheers

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

谁人与我共长歌 2024-11-01 21:12:56

如果您安装了 gd lib(使用 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];

If you have the gd lib installed (check with phpinfo(); ) it's something like

//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);

EDIT

You said it was RGBA data. Assuming standard 4 bytes per channel and that your raw data is an integer array, it should be:

$pos = ($y * $width + $x) * 4 + ($headerLengthInBytes / 4);
$red = $rawImageData[$pos];
$green = $rawImageData[$pos + 1];
$blue = $rawImageData[$pos + 2];
$alpha = $rawImageData[$pos + 3];
初见你 2024-11-01 21:12:56

虽然您可以自己从源流生成未压缩的 PNG,但这需要付出很大的努力。 (需要手工制作 png32 标头,并写出未压缩的 deflate 块,因为 PNG 本身不支持未压缩的有效负载)。

使用 imagemagick 更容易。只需将原始 RGBA 流写入临时文件并使用:

file_put_contents("tmp.rgba", susbstr($data, 128));

exec("convert -size 640x300 -depth 8   tmp.rgba output.png");

While you could generate an uncompressed PNG from your source stream yourself, that takes a lot of effort. (Need to handicraft the png32 header, and write out uncompressed deflate chunks because PNG itself supports no uncompressed payloads).

It's easier with imagemagick. Simply write out your raw RGBA stream to a temporary file and use:

file_put_contents("tmp.rgba", susbstr($data, 128));

exec("convert -size 640x300 -depth 8   tmp.rgba output.png");
三月梨花 2024-11-01 21:12:56

我会查看 gdimagemagick 其中一个或两个应该可以解决问题

I would look at gd or imagemagick one or both of these should do the trick

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文