各位达人,小弟最近学习数字图象处理,要绘制一个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);
}
#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);
}
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个
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;
}//颜色表