【问题标题】:Get RGB Channels From Pixel Value Without Any Library无需任何库即可从像素值获取 RGB 通道
【发布时间】:2013-05-19 18:10:33
【问题描述】:

无需任何库即可从像素值获取 RGB 通道
我正在尝试获取从图像中读取的每个像素的 RGB 通道。 我通过从图像中读取每个字节来使用 getchar。 所以在我在网上做了一些搜索后,我发现了 BMP 例如颜色数据在 36 字节之后开始,我知道每个通道是 8 位,整个 RGB 是 8 位红色,8 位绿色和8 点蓝色。我的问题是如何从像素值中提取它们?
例如:

pixel = getchar(image);

我可以做些什么来提取这些频道?此外,我在 JAVA 上看到了这个示例,但不知道如何在 C++ 上实现它:

int rgb[] = new int[] {
(argb >> 16) & 0xff, //red
(argb >>  8) & 0xff, //green
(argb      ) & 0xff  //blue
};

我猜想 argb 是我之前提到的“像素”变量。
谢谢。

【问题讨论】:

  • 只需查找“bmp 文件读取”即可。它并没有什么特别之处。

标签: c++ image-processing rgb


【解决方案1】:

假设它被编码为 ABGR 并且每个像素有一个整数值,这应该可以解决问题:

int r = color & 0xff;
int g = (color >> 8) & 0xff;
int b = (color >> 16) & 0xff;
int a = (color >> 24) & 0xff;

【讨论】:

    【解决方案2】:

    读取单个字节时,取决于格式的字节顺序。由于有两种可能的方式,这当然总是不一致的,所以我将两种方式都写出来,读取作为伪函数完成:

    RGBA:

    int r = readByte();
    int g = readByte();
    int b = readByte();
    int a = readByte();
    

    ABGR:

    int a = readByte();
    int b = readByte();
    int g = readByte();
    int r = readByte();
    

    它的编码方式取决于您的文件格式的布局方式。我还看到了 BGRA 和 ARGB 顺序以及平面 RGB(每个通道都是宽度 x 高度字节的单独缓冲区)。

    看起来维基百科对 BMP 文件的外观有很好的概述: http://en.wikipedia.org/wiki/BMP_file_format

    由于它似乎有点复杂,我强烈建议为此使用库而不是自己滚动。

    【讨论】:

    • 第二个例子中你好像忘记交换顺序了。
    • 谢谢。使用复制和粘贴的危险之一。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多