各位达人,小弟最近学习数字图象处理,要绘制一个256*256象素大小的马赫带,但是在绘制过程中出现了问题,生成bmp图象文件之后,在windows操作系统下打开bmp图象显示总是黑的,望达人们帮忙讲解,万分感激..:
#include <stdio.h>
#include<windows.h>
#include<math.h>
#include<stdlib.h>struct bmphdr{ // bmfh 
    WORD    bfType; 
    DWORD   bfSize; 
    WORD    bfReserved1; 
    WORD    bfReserved2; 
    DWORD   bfOffBits;  //位图文件头
    DWORD  biSize; 
    LONG   biWidth; 
    LONG   biHeight; 
    WORD   biPlanes; 
    WORD   biBitCount; 
    DWORD  biCompression; 
    DWORD  biSizeImage; 
    LONG   biXPelsPerMeter; 
    LONG   biYPelsPerMeter; 
    DWORD  biClrUsed; 
    DWORD  biClrImportant;  //位图信息头
    BYTE    rgbBlue; 
    BYTE    rgbGreen; 
    BYTE    rgbRed; 
    BYTE    rgbReserved;  //颜色表
    DWORD info[1020];//补齐剩下空间,使位图数据从距文件头1078个字节处开始
}hdr; void main(){
hdr.bfType=0x4D42;
hdr.bfSize=66614;
hdr.bfReserved1=0;
hdr.bfReserved2=0;
hdr.bfOffBits=1078;
hdr.biSize=40;
hdr.biWidth=256;
hdr.biHeight=256;
hdr.biPlanes=1;
hdr.biBitCount=8;
hdr.biCompression=0;
hdr.biSizeImage=65536;
hdr.biXPelsPerMeter=3780;
hdr.biYPelsPerMeter=3780;
hdr.biClrUsed=0;
hdr.biClrImportant=0;
hdr.rgbBlue=0;
hdr.rgbGreen=0;
hdr.rgbRed=0;
hdr.rgbReserved=0;
FILE *fp;
fp=fopen("单个马赫带.bmp","wb+");
fwrite(&hdr.bfType,2,1,fp);
fwrite(&hdr.bfSize,4,1,fp);
fwrite(&hdr.bfReserved1,2,1,fp);
fwrite(&hdr.bfReserved2,2,1,fp);
fwrite(&hdr.bfOffBits,4,1,fp);//写入位图文件头

fwrite(&hdr.biSize,4,1,fp);
fwrite(&hdr.biWidth,4,1,fp);
fwrite(&hdr.biHeight,4,1,fp);
fwrite(&hdr.biPlanes,2,1,fp);
fwrite(&hdr.biBitCount,2,1,fp);
fwrite(&hdr.biCompression,4,1,fp);
fwrite(&hdr.biSizeImage,4,1,fp);
fwrite(&hdr.biXPelsPerMeter,4,1,fp);
fwrite(&hdr.biYPelsPerMeter,4,1,fp);
fwrite(&hdr.biClrUsed,4,1,fp);
fwrite(&hdr.biClrImportant,4,1,fp);//写入位图信息头 fwrite(&hdr.rgbBlue,1,1,fp);
fwrite(&hdr.rgbGreen,1,1,fp);
fwrite(&hdr.rgbRed,1,1,fp);
fwrite(&hdr.rgbReserved,1,1,fp);//写入颜色表 if (hdr.bfOffBits > 58)
fwrite(hdr.info, hdr.bfOffBits - 58, 1, fp);//补齐1078
unsigned char *to_tem;
int nr_pixels,i;
nr_pixels = hdr.biWidth * hdr.biHeight;
to_tem=(unsigned char *)malloc(nr_pixels); for(i=0;i < nr_pixels;i++)
to_tem[i]=i%256;

fwrite(to_tem,nr_pixels,1,fp); fclose(fp);

}

解决方案 »

  1.   


    fwrite(&hdr.rgbBlue,1,1,fp);
    fwrite(&hdr.rgbGreen,1,1,fp);
    fwrite(&hdr.rgbRed,1,1,fp);
    fwrite(&hdr.rgbReserved,1,1,fp);//写入颜色表  应该写入256个
      

  2.   

    ^_^谢谢大家的帮助,尤其要谢谢hony688大哥^_^,其实只要把写入颜色表的那段代码改成一下就好了,补齐1078的那段代码删除掉:
             int k=0;
    for(int j=0;;j=k){

    hdr.rgbBlue=(BYTE)j;
    hdr.rgbGreen=(BYTE)j;
    hdr.rgbRed=(BYTE)j;
    fwrite(&hdr.rgbBlue,1,1,fp);
    fwrite(&hdr.rgbGreen,1,1,fp);
    fwrite(&hdr.rgbRed,1,1,fp);
    fwrite(&hdr.rgbReserved,1,1,fp);
    k++;
    if(k>255)break;
    }//颜色表