【问题标题】:PHP save raw RGBA as PNG/GIFPHP 将原始 RGBA 保存为 PNG/GIF
【发布时间】:2011-07-21 06:55:31
【问题描述】:

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

干杯

【问题讨论】:

    标签: php png gif


    【解决方案1】:

    如果你安装了 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(),但该功能需要一个图像处理程序,而我没有。有什么建议吗?
    • 谢谢 :) 我不得不打开 RGBA 的包装,但最终还是成功了。最终代码如下:$pos = ($y * $width + $x) * 4; list($red, $green, $blue, $alpha) = array_values(unpack("C4", substr($buffer, $pos, $pos+4)));
    【解决方案2】:

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

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

    file_put_contents("tmp.rgba", susbstr($data, 128));
    
    exec("convert -size 640x300 -depth 8   tmp.rgba output.png");
    

    【讨论】:

    • 不幸的是,我的主机不支持 ImageMagick,因此我无法使用它。 :(
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-02-14
      • 1970-01-01
      • 2014-03-27
      • 2016-05-17
      • 2013-06-05
      • 2016-10-03
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      相关资源
      最近更新 更多