将BMP转换为灰度图

标签 c image-processing grayscale

我开始搞图像处理,想知道是否有一种方法可以在不使用图像处理库的情况下制作灰度图像,我知道前三位给出了有关图像、格式和大小的信息,从现在开始我想制作灰度图像
这是代码:

#include <stdio.h>
int main(){
FILE * binary = fopen("C:/Arabidopsis3.bmp", "rb");
FILE * bCopy=fopen("C:/copy.bmp","wb");
int get_char;
int i=3;
while ((get_char=fgetc(binary))!= EOF)
 {
if(i>3)
    {
                 doing the grayscale process
             }
    fputc(get_char, bCopy);
    i++;
  }
  fclose(binary);
  fclose(bCopy);
  return 0;
 }

如您所见,我将 bmp 复制到 copy.bmp 中,但 copy.bmp 应该是灰度的。 有什么建议吗?

最佳答案

首先,BMP 文件格式有一个被剥离的头文件(不在内存中)。在 header 之后,有一个固定大小的内存区域,但下一个区域有 7 种不同的格式: http://en.wikipedia.org/wiki/BMP_file_format

您必须确定格式,然后确定每个像素需要多少字节。然后您需要了解像素描述格式。

如果您只做一点研究,所有这一切都非常容易。我对文件格式不太了解,但如果您只了解其结构,您应该能够很容易地做到这一点。

编辑:

好吧,如果您知道每个像素值所在的位置,那么您应该能够通过使用指针沿着像素数组遍历来提取它们。例如,如果您知道图像中有 8 个像素,并且每个像素由 8 个字节定义,则可以使用 8 字节指针沿着像素数组遍历,方法是将 8 字节指针放置在像素数组部分的开头,然后做你的异或。我不知道如何制作灰度;我假设你只是摆脱了所有的颜色值。因此,如果第一个字节描述灰度,其余是颜色数据,您只需获取颜色数据并确保这些位设置为 0。

关于将BMP转换为灰度图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16487422/

相关文章:

WPF - 在滚动查看器中放大图像,并相应地调整滚动条

c++ - 如何为每个栅格波段设置最小和最大颜色值(使用 GDAL)

c++ - 你如何删除 OpenCV 中的 cvseq?

browser - 缩放存储在 S3 中的图像

python - 使用openCV确定文本中的分割线

c# - 将 24bpp 位图转换为 1bpp

Matlab:imgradient 返回量化图像

c - 尝试获取指向 int 的指针时出现段错误

c - 为什么我不能将 const 指针分配给结构中的 const 指针?

c - 从用户空间,我如何判断Linux的软看门狗是否配置为无路可退?