xiebmp.cpp

来自「Bayer抖动法显示图像及随机抖动法显示图像」· C++ 代码 · 共 149 行

CPP
149
字号
#include "stdio.h" 
#include "stdlib.h" 

#define PIXPLINE 320 

typedef struct tagRGBQUAD{ //定义每个像素的数据类型 
unsigned char rgbBlue; 
unsigned char rgbGreen; 
unsigned char rgbRed; 
} RGBQUAD; 

int bmp_read(unsigned char *image, int xsize, int ysize, char *filename) { 
char fname_bmp[128]; 
sprintf(fname_bmp, "%s.bmp", filename); 

FILE *fp; 
if (!(fp = fopen(fname_bmp, "rb"))) 
return -1; 

unsigned char header[54]; 
fread(header, sizeof(unsigned char), 54, fp); 
fread(image, sizeof(unsigned char), (size_t)(long)xsize * ysize * 3, fp); 

fclose(fp); 
return 0; 
} 

int bmp_write(unsigned char *image, int xsize, int ysize, char *filename) { 
unsigned char header[54] = { 
0x42, 0x4d, 0, 0, 0, 0, 0, 0, 0, 0, 
54, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0 
}; 

long file_size = (long)xsize * (long)ysize * 354; 
header[2] = (unsigned char)(file_size &0x000000ff); 
header[3] = (file_size >> 8) & 0x000000ff; 
header[4] = (file_size >> 16) & 0x000000ff; 
header[5] = (file_size >> 24) & 0x000000ff; 

long width = xsize; 
header[18] = width & 0x000000ff; 
header[19] = (width >> 8) &0x000000ff; 
header[20] = (width >> 16) &0x000000ff; 
header[21] = (width >> 24) &0x000000ff; 

long height = ysize; 
header[22] = height &0x000000ff; 
header[23] = (height >> 8) &0x000000ff; 
header[24] = (height >> 16) &0x000000ff; 
header[25] = (height >> 24) &0x000000ff; 

char fname_bmp[128]; 
sprintf(fname_bmp, "%s.bmp", filename); 

FILE *fp; 
if (!(fp = fopen(fname_bmp, "wb"))) 
return -1; 

fwrite(header, sizeof(unsigned char), 54, fp); 
fwrite(image, sizeof(unsigned char), (size_t)(long)xsize * ysize * 3, fp); 

fclose(fp); 
return 0; 
} 
int youwritetobmp(RGBQUAD *pixarr, int xsize, int ysize, char *filename) { 
unsigned char header[54] = { 
0x42, 0x4d, 0, 0, 0, 0, 0, 0, 0, 0, 
54, 0, 0, 0, 40, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 24, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0 
}; 
int i; 
int j; 
long file_size = (long)xsize * (long)ysize * 354; 
header[2] = (unsigned char)(file_size &0x000000ff); 
header[3] = (file_size >> 8) & 0x000000ff; 
header[4] = (file_size >> 16) & 0x000000ff; 
header[5] = (file_size >> 24) & 0x000000ff; 

long width; 
if(!(xsize%4)) width=xsize; 
else width= xsize (4-xsize%4); //如不是4的倍数,则转换成4的倍数 
header[18] = width & 0x000000ff; 
header[19] = (width >> 8) &0x000000ff; 
header[20] = (width >> 16) &0x000000ff; 
header[21] = (width >> 24) &0x000000ff; 

long height = ysize; 
header[22] = height &0x000000ff; 
header[23] = (height >> 8) &0x000000ff; 
header[24] = (height >> 16) &0x000000ff; 
header[25] = (height >> 24) &0x000000ff; 

char fname_bmp[128]; 
sprintf(fname_bmp, "%s.bmp", filename); 

FILE *fp; 
if (!(fp = fopen(fname_bmp, "wb"))) 
return -1; 

fwrite(header, sizeof(unsigned char), 54, fp); 

RGBQUAD zero={0,0,0}; //不足字节,用zero填充 

for(j=0;j <ysize;j ){ 
if(!(xsize%4))...{ 
for(i=0;i <xsize;i ){ 
fwrite(pixarr i, sizeof(RGBQUAD),1, fp); 
} 
} 
else 
{ 
for(i=0;i <xsize;i ){ 
fwrite(pixarr i, sizeof(RGBQUAD),1, fp); 
} 
for(i=xsize;i <xsize (4-xsize%4);i ){ 
fwrite(&zero, sizeof(RGBQUAD),1, fp); 
} 
} 
} 

fclose(fp); 
return 0; 

} 

int main() { 
unsigned char *image; 
int xsize = 320; 
int ysize = 163; 

RGBQUAD pixarray[PIXPLINE]; //一行像素值数组 

image = (unsigned char *)malloc((size_t)xsize * ysize * 3); 
if (image == NULL) 
return -1; 
//clonebmp(image,xsize,ysize); //功能一:实现一副图像的拷贝 


youwritetobmp(pixarray,xsize,ysize,"yourimage");//功能二:实现像素的精确绘制,像素值在pixarray数组中 

free(image); 
return -1; 
} 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?