在没有 GD 的情况下在 PHP 中加载 PNG 并读取像素?

发布于 2024-07-14 06:16:20 字数 422 浏览 7 评论 0原文

我需要从真彩色 PNG 文件(最好是 PHP)中读取准确的未改变的像素数据(ARGB)。

不幸的是,PHP 中的 GD 库混淆了 alpha 通道(将其从 8 位减少到 7 位),使其无法使用。

我目前假设我的选择是:

  1. 实现我自己的原始 PNG 阅读器来提取必要的数据。
  2. 使用一些不太破坏的语言/库,并从 PHP 作为 shell 进程或 CGI 调用它。

不过,我有兴趣听到任何其他想法,或者对一种方式的建议而不是另一种方式的建议...

编辑:我认为#1 已经过时了。 我尝试将 IDAT 数据流传递给 gzinflate(),但它只是给了我一个数据错误。 (在 PHP 之外使用完全相同的数据执行完全相同的操作会产生预期的结果。)

I have a need to read in the exact unaltered pixel data (ARGB) from a truecolour PNG file, preferably from PHP.

Unfortunately the GD library in PHP messes with the alpha channel (reducing it from 8-bit to 7-bit), making it unusable.

I'm currently assuming that my options are either:

  1. Implement my own raw PNG reader to extract the necessary data.
  2. Use some less-broken language/library and call it from the PHP as a shell process or CGI.

I'd be interested to hear any other ideas, though, or recommendations for one way over the other...

Edit: I think #1 is out. I've tried passing the IDAT data stream to gzinflate(), but it just gives me a data error. (Doing the exact same thing, with the exact same data, outside of PHP produces the expected result.)

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

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

发布评论

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

评论(2

深海蓝天 2024-07-21 06:16:20

ImageMagick 怎么样?

<?php
$im = new Imagick("foo.png");
$it = $im->getPixelIterator();

foreach($it as $row => $pixels) {
    foreach ($pixels as $column => $pixel) {
        // Do something with $pixel
    }

    $it->syncIterator();
}
?>

How about ImageMagick?

<?php
$im = new Imagick("foo.png");
$it = $im->getPixelIterator();

foreach($it as $row => $pixels) {
    foreach ($pixels as $column => $pixel) {
        // Do something with $pixel
    }

    $it->syncIterator();
}
?>
半世晨晓 2024-07-21 06:16:20

您可以使用 netpbm 的 pngtopnm 函数将 PNG 轻松转换为解析 PNM。 这是一个有点幼稚的 php 脚本,应该可以帮助您获得所需的内容:

<?php
$pngFilePath = 'template.png';
// Get the raw results of the png to pnm conversion
$contents = shell_exec("pngtopnm $pngFilePath");
// Break the raw results into lines
//  0: P6
//  1: <WIDTH> <HEIGHT>
//  2: 255
//  3: <BINARY RGB DATA>
$lines = preg_split('/\n/', $contents);

// Ensure that there are exactly 4 lines of data
if(count($lines) != 4)
    die("Unexpected results from pngtopnm.");

// Check that the first line is correct
$type = $lines[0];
if($type != 'P6')
    die("Unexpected pnm file header.");

// Get the width and height (in an array)
$dimensions = preg_split('/ /', $lines[1]);

// Get the data and convert it to an array of RGB bytes
$data = $lines[3];
$bytes = unpack('C*', $data);

print_r($bytes);
?>

You can use the pngtopnm function of netpbm to convert the PNG to an easily parsed PNM. Here is a somewhat naive php script that should help you get what you need:

<?php
$pngFilePath = 'template.png';
// Get the raw results of the png to pnm conversion
$contents = shell_exec("pngtopnm $pngFilePath");
// Break the raw results into lines
//  0: P6
//  1: <WIDTH> <HEIGHT>
//  2: 255
//  3: <BINARY RGB DATA>
$lines = preg_split('/\n/', $contents);

// Ensure that there are exactly 4 lines of data
if(count($lines) != 4)
    die("Unexpected results from pngtopnm.");

// Check that the first line is correct
$type = $lines[0];
if($type != 'P6')
    die("Unexpected pnm file header.");

// Get the width and height (in an array)
$dimensions = preg_split('/ /', $lines[1]);

// Get the data and convert it to an array of RGB bytes
$data = $lines[3];
$bytes = unpack('C*', $data);

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