2

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

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

4

2 回答 2

2

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

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

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

编辑:

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

于 2013-05-10T17:11:10.877 回答
0

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

于 2013-05-10T17:12:24.007 回答