【问题标题】:How to populate Bitmap object with pixels from pngcs?如何使用来自 pngcs 的像素填充位图对象?
【发布时间】:2016-02-19 15:38:30
【问题描述】:

像素按顺序存储在 PNG 中(在 2 种变体中 - 原始和 Adam 隔行扫描)。有 RFC 2083,它描述了这些布局的变体。我想了解如何将流中的像素位置转换为位图中的位置。

有一些障碍 - 序号取决于图像的尺寸(在隔行扫描模式下,可以跳过一些像素,因为它们超出了界限)。

这个怎么实现清晰,或者有现成的实现吗?

【问题讨论】:

  • 你想做什么?如果您尝试直接读取 png 文件,它不是像素数据,它是经过压缩和编码的,在解压缩和解码后,您将获得像素数据,所有这些都可以自动为您完成,只需使用 Image.FromFile ...
  • 你在搞混东西,你在帮助中指出的类不像读取 png 那样做,它需要一个 已经加载 png 并对其进行操作。同样,读取 PNG 不仅仅是读取像素数据的问题,它是 LZH 压缩和 RLE 编码的,最好采用托管的预制类而不是自己做,比如 pngcs 已经返回像素数据
  • 我正在询问如何使用 pngcs 中的像素在位图上绘图
  • pngcs 将为我解决您上面描述的所有问题。我只需要用这些像素填充 Bitmap 对象

标签: c# png transform


【解决方案1】:

如果您使用的是您所说的 pngcs,您将收到一个表示像素数据的整数数组,而无需关心交错。

那就简单了,看https://github.com/leonbloy/pngcs/blob/master/SamplesTests/SampleTileImage.cs的例子,每个X个整数是一个像素,X是由通道数量定义的,所以每个整数都是一个像素的一个分量,也就是说每一行都有[components * imageWidth ] 整数。

要重建数据,双 for 循环就足够了,这是一个四分量 (RGBA) 的 PNG 示例:

int componentSize = 4;
int lineSize = componentSize * imageWidth;
int linesOnImage = imageData.Length / lineSize;

for(int y = 0; y < linesOnImage; y++)
{
    for(int x = 0; x < imageWidth; x++)
    {
        int startPixel = y * lineSize + (x * componentSize);
        Color c = Color.FromArgb(imageData[startPixel + 3], imageData[startPixel], imageData[startPixel + 1], imageData[startPixel + 2]);
        //Do whatever you need to do with the pixel, you have X and Y coordinates and the color
    }
}

请注意,颜色的第一个参数是像素的最后一个组件,因为 Color 需要 ARGB 输入,而 PNG 使用 RGBA 顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多