在C中创建BMP文件(位图)
我正在尝试用C语言制作一个位图,只是从代码开始。我目前正在尝试制作一个非常简单的.bmp图像,高度为1px,宽度为4像素,全部为白色像素。我已经阅读了格式说明并尝试应用它。这导致了以下代码:在C中创建BMP文件(位图),c,bitmap,bmp,C,Bitmap,Bmp,我正在尝试用C语言制作一个位图,只是从代码开始。我目前正在尝试制作一个非常简单的.bmp图像,高度为1px,宽度为4像素,全部为白色像素。我已经阅读了格式说明并尝试应用它。这导致了以下代码: char bitmap[1000]; void BMPmake() { // -- FILE HEADER -- // // bitmap signature bitmap[0] = 'B'; bitmap[1] = 'M'; // file size
char bitmap[1000];
void BMPmake()
{
// -- FILE HEADER -- //
// bitmap signature
bitmap[0] = 'B';
bitmap[1] = 'M';
// file size
bitmap[2] = 66; // 40 + 14 + 12
bitmap[3] = 0;
bitmap[4] = 0;
bitmap[5] = 0;
// reserved field (in hex. 00 00 00 00)
for(int i = 6; i < 10; i++) bitmap[i] = 0;
// offset of pixel data inside the image
for(int i = 10; i < 14; i++) bitmap[i] = 0;
// -- BITMAP HEADER -- //
// header size
bitmap[14] = 40;
for(int i = 15; i < 18; i++) bitmap[i] = 0;
// width of the image
bitmap[18] = 4;
for(int i = 19; i < 22; i++) bitmap[i] = 0;
// height of the image
bitmap[22] = 1;
for(int i = 23; i < 26; i++) bitmap[i] = 0;
// reserved field
bitmap[26] = 1;
bitmap[27] = 0;
// number of bits per pixel
bitmap[28] = 24; // 3 byte
bitmap[29] = 0;
// compression method (no compression here)
for(int i = 30; i < 34; i++) bitmap[i] = 0;
// size of pixel data
bitmap[34] = 12; // 12 bits => 4 pixels
bitmap[35] = 0;
bitmap[36] = 0;
bitmap[37] = 0;
// horizontal resolution of the image - pixels per meter (2835)
bitmap[38] = 0;
bitmap[39] = 0;
bitmap[40] = 0b00110000;
bitmap[41] = 0b10110001;
// vertical resolution of the image - pixels per meter (2835)
bitmap[42] = 0;
bitmap[43] = 0;
bitmap[44] = 0b00110000;
bitmap[45] = 0b10110001;
// color pallette information
for(int i = 46; i < 50; i++) bitmap[i] = 0;
// number of important colors
for(int i = 50; i < 54; i++) bitmap[i] = 0;
// -- PIXEL DATA -- //
for(int i = 54; i < 66; i++) bitmap[i] = 0;
}
void BMPwrite()
{
FILE *file;
file = fopen("bitmap.bmp", "w+");
for(int i = 0; i < 66; i++)
{
fputc(bitmap[i], file);
}
fclose(file);
}
char位图[1000];
void BMPmake()
{
//--文件头--//
//位图签名
位图[0]=“B”;
位图[1]=“M”;
//文件大小
位图[2]=66;//40+14+12
位图[3]=0;
位图[4]=0;
位图[5]=0;
//保留字段(十六进制)
对于(inti=6;i<10;i++)位图[i]=0;
//图像内像素数据的偏移量
对于(inti=10;i<14;i++)位图[i]=0;
//--位图头--//
//标题大小
位图[14]=40;
对于(inti=15;i<18;i++)位图[i]=0;
//图像的宽度
位图[18]=4;
对于(inti=19;i<22;i++)位图[i]=0;
//图像的高度
位图[22]=1;
对于(inti=23;i<26;i++)位图[i]=0;
//保留字段
位图[26]=1;
位图[27]=0;
//每像素位数
位图[28]=24;//3字节
位图[29]=0;
//压缩方法(此处无压缩)
对于(inti=30;i<34;i++)位图[i]=0;
//像素数据的大小
位图[34]=12;//12位=>4像素
位图[35]=0;
位图[36]=0;
位图[37]=0;
//图像的水平分辨率-每米像素数(2835)
位图[38]=0;
位图[39]=0;
位图[40]=0B0011000;
位图[41]=0b10110001;
//图像的垂直分辨率-每米像素数(2835)
位图[42]=0;
位图[43]=0;
位图[44]=0B0011000;
位图[45]=0b10110001;
//彩色托盘信息
对于(inti=46;i<50;i++)位图[i]=0;
//重要颜色的数量
对于(inti=50;i<54;i++)位图[i]=0;
//--像素数据--//
对于(inti=54;i<66;i++)位图[i]=0;
}
void BMPwrite()
{
文件*文件;
file=fopen(“bitmap.bmp”,“w+”);
对于(int i=0;i<66;i++)
{
fputc(位图[i],文件);
}
fclose(文件);
}
当我试图打开此图像时,它表示图像已损坏。我是不是遗漏了什么
我还注意到.bmp整数的编码是little endian。我认为这意味着我必须颠倒字节的顺序。例如,四个字节中的256是:00000000 00000000 00000001 00000000,我想在little endian中应该是:00000000 00000001 00000000
有人能帮我一下吗?我是否使用了正确的方法?任何帮助都将不胜感激
提前谢谢 像素偏移量(字节10..13)为零,但像素数据实际上并不从文件的开头开始,而是从字节54开始
此外:
- 你对字节34的评论是“位”,但意思是“字节”,当然这并不重要
- 您的水平和垂直分辨率的字节顺序错误,但我非常怀疑这是否重要
是否“必须反转字节顺序”取决于所使用的处理器的endianity。在您这样做时,单独写入单独的字节是一种有效的方法,可以避免担心这个问题。使用十六进制编辑器打开文件,查看实际存在的内容。这将帮助您确定代码是否执行了意外操作。以下是在linux上测试的代码
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <malloc.h>
#define _height 600
#define _width 800
#define _bitsperpixel 24
#define _planes 1
#define _compression 0
#define _pixelbytesize _height*_width*_bitsperpixel/8
#define _filesize _pixelbytesize+sizeof(bitmap)
#define _xpixelpermeter 0x130B //2835 , 72 DPI
#define _ypixelpermeter 0x130B //2835 , 72 DPI
#define pixel 0xFF
#pragma pack(push,1)
typedef struct{
uint8_t signature[2];
uint32_t filesize;
uint32_t reserved;
uint32_t fileoffset_to_pixelarray;
} fileheader;
typedef struct{
uint32_t dibheadersize;
uint32_t width;
uint32_t height;
uint16_t planes;
uint16_t bitsperpixel;
uint32_t compression;
uint32_t imagesize;
uint32_t ypixelpermeter;
uint32_t xpixelpermeter;
uint32_t numcolorspallette;
uint32_t mostimpcolor;
} bitmapinfoheader;
typedef struct {
fileheader fileheader;
bitmapinfoheader bitmapinfoheader;
} bitmap;
#pragma pack(pop)
int main (int argc , char *argv[]) {
FILE *fp = fopen("test.bmp","wb");
bitmap *pbitmap = (bitmap*)calloc(1,sizeof(bitmap));
uint8_t *pixelbuffer = (uint8_t*)malloc(_pixelbytesize);
strcpy(pbitmap->fileheader.signature,"BM");
pbitmap->fileheader.filesize = _filesize;
pbitmap->fileheader.fileoffset_to_pixelarray = sizeof(bitmap);
pbitmap->bitmapinfoheader.dibheadersize =sizeof(bitmapinfoheader);
pbitmap->bitmapinfoheader.width = _width;
pbitmap->bitmapinfoheader.height = _height;
pbitmap->bitmapinfoheader.planes = _planes;
pbitmap->bitmapinfoheader.bitsperpixel = _bitsperpixel;
pbitmap->bitmapinfoheader.compression = _compression;
pbitmap->bitmapinfoheader.imagesize = _pixelbytesize;
pbitmap->bitmapinfoheader.ypixelpermeter = _ypixelpermeter ;
pbitmap->bitmapinfoheader.xpixelpermeter = _xpixelpermeter ;
pbitmap->bitmapinfoheader.numcolorspallette = 0;
fwrite (pbitmap, 1, sizeof(bitmap),fp);
memset(pixelbuffer,pixel,_pixelbytesize);
fwrite(pixelbuffer,1,_pixelbytesize,fp);
fclose(fp);
free(pbitmap);
free(pixelbuffer);
}
#包括
#包括
#包括
#包括
#定义高度600
#定义_宽度800
#定义_bitsperpixel24
#定义_平面1
#定义压缩0
#定义_pixelbytesize _高度*_宽度*_位像素/8
#定义_filesize _pixelbytesize+sizeof(位图)
#定义xpixelpermeter 0x130B//2835,72 DPI
#定义_ypixelpermeter0x130b//2835,72 DPI
#定义像素0xFF
#pragma包(推送,1)
类型定义结构{
uint8_t签名[2];
uint32_t文件大小;
uint32保留;
uint32_t fileoffset_to_pixelarray;
}文件头;
类型定义结构{
uint32_t DibHeaderize;
uint32_t宽度;
uint32_t高度;
uint16_t平面;
uint16_t比特像素;
uint32_t压缩;
uint32_t图像大小;
uint32_t渗透计;
uint32_t X离子渗透计;
uint32_t NumcolorsPallete;
uint32_t mostimpcolor;
}位图信息头;
类型定义结构{
文件头文件头;
BitMapInfo标头BitMapInfo标头;
}位图;
#布拉格语包(流行语)
int main(int argc,char*argv[]){
文件*fp=fopen(“test.bmp”、“wb”);
位图*pbitmap=(位图*)calloc(1,sizeof(位图));
uint8_t*像素缓冲=(uint8_t*)malloc(_pixelbytesize);
strcpy(pbitmap->fileheader.signature,“BM”);
pbitmap->fileheader.filesize=\u filesize;
pbitmap->fileheader.fileoffset_to_pixelarray=sizeof(位图);
pbitmap->BitMapInfo标头.dibheadersize=sizeof(BitMapInfo标头);
pbitmap->bitmapinfo.width=\u width;
pbitmap->bitmapinfo.height=\u height;
pbitmap->bitmapinfo.planes=\u平面;
pbitmap->bitmapinfo.bitsperpixel=\u bitsperpixel;
pbitmap->bitmapinfo.compression=\u compression;
pbitmap->bitmapinfoheader.imagesize=\u像素字节大小;
pbitmap->bitmapinfo.ypixelpermeter=\u ypixelpermeter;
pbitmap->bitmapinfo.xpixelpermeter=\u xpixelpermeter;
pbitmap->BitMapInfo header.numcolorspallette=0;
fwrite(pbitmap,1,sizeof(位图),fp);
memset(像素缓冲区,像素,_pixelbytesize);
fwrite(像素缓冲区,1,_pixelbytesize,fp);
fclose(fp);
免费(pbitmap);
自由(像素缓冲);
}
使用您喜爱的图形编辑器绘制您想要生成的图像,然后尝试逐字节复制。分辨率字段的endianness错误。你会找到你的工作的