将BMP转换为灰度问题

时间:2013-05-10 17:06:06

标签: 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应该是灰度的。 有什么建议吗?

2 个答案:

答案 0 :(得分:2)

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

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

如果你只做一点研究,这一切都很容易。我对文件格式知之甚少,但如果你只是了解它的结构,你应该能够很容易地做到这一点。

编辑:

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

答案 1 :(得分:0)

如果这是一个Windows位图,那么您的非结构化方法是不明智的。我建议您阅读Windows SDK以获取有关操作bmp文件的信息。一些关键字指向正确的方向:BITMAPINFOHEADER,GetDIBits / SetDIBits。此外,GDI +还有一些非常方便的包装器用于加载和保存图像。