c语言在8位bmp位图上画一个框并另存

//              570
/***********************************
*                                  *
*                                  *
*                                  *
*                                  *  400
*                                  *
*                                  *
*                                  *
************************************/
#include<stdio.h>
#include<windows.h>
int main() { FILE* fp; errno_t err; unsigned int j, k; BITMAPFILEHEADER FileHeader; BITMAPINFOHEADER InfoHeader; RGBQUAD *IpRGBQuad; char FileName[30]; IpRGBQuad = (RGBQUAD *)malloc(256*sizeof(RGBQUAD));//灰度图为8位的调色板数据为256个结构,1024个字节 strcpy_s(FileName, "F:\\256.bmp"); err = fopen_s(&fp,FileName, "rb"); if( err!=0 ) { printf_s("cannot open this file"); return 0; } /* int r1,r18,r19; int width=0; for(int i=0;i<=53;i++) { r1=getc(fp); if(i==19) r19=(int)r1; if(i==18) r18=(int)r1; fwrite(&r1,sizeof(char),1,fp); }//前53个字节包含了文件信息,所以直接复制,其中width信息存在18到21中,且倒着存的 width=width+r19*256+r18;//计算width fseek(fp,0L,0); fseek(fp,0L,0); */ //读取位图文件头 printf_s("\n\n------------------------位图文件头----------------------------------------\n\n"); fread(&FileHeader, sizeof(FileHeader), 1, fp); printf_s("文件类型%X\n",FileHeader.bfType); printf_s("文件大小(单位字节):%lu\n", FileHeader.bfSize); printf_s("备用:%X\n", FileHeader.bfReserved1); printf_s("备用:%X\n", FileHeader.bfReserved2); printf_s("图像开始处的字节偏移:%lu\n", FileHeader.bfOffBits); //读取位图信息头 printf_s("\n\n-------------------------位图信息头----------------------------------------\n\n"); fread(&InfoHeader, sizeof(InfoHeader), 1, fp); printf_s("信息头大小:%lu\n", InfoHeader.biSize); printf_s("图像宽度:%d\n", InfoHeader.biWidth); printf_s("图像高度:%d\n", InfoHeader.biHeight); printf_s("位平面数:%d\n", InfoHeader.biPlanes); printf_s("每像素位数:%d\n", InfoHeader.biBitCount); printf_s("压缩类型:%lu\n", InfoHeader.biCompression); printf_s("压缩图像大小的字节数:%lu\n", InfoHeader.biSizeImage); printf_s("水平分辨率:%ld\n", InfoHeader.biXPelsPerMeter); printf_s("垂直分辨率:%ld\n", InfoHeader.biYPelsPerMeter ); printf_s("使用的色彩数:%lu\n", InfoHeader.biClrUsed); printf_s("重要色彩数:%lu\n", InfoHeader.biClrImportant); //读取调色板数据 //printf_s("\n\n-----------------------------调色板------------------------------------------\n\n"); //printf_s("\t红\t绿\t蓝\n"); fread(IpRGBQuad, sizeof(RGBQUAD), 256, fp); for (int i = 0; i < 256; i++) { //printf("\t%X\t%X\t%X\n",IpRGBQuad[i].rgbBlue , IpRGBQuad[i].rgbGreen , IpRGBQuad[i].rgbRed ); } //读取像素数据 InfoHeader.biWidth = InfoHeader.biWidth+2; /**************这里为什么要加2????*************/ long sizei = InfoHeader.biWidth*InfoHeader.biHeight; char bitMap[400][572]; //这个值就是上面的 biHeight 和 biWidth fread(bitMap,sizeof(char),sizei,fp); //使100行全部变黑 for(int i = 0;i<InfoHeader.biWidth;i++){ if(i>200&&i<400) bitMap[100][i]=0; } //使300行全部变黑 for(int i = 0;i<InfoHeader.biWidth;i++){ if(i>200&&i<400) bitMap[300][i]=0; } //使每一行的200列变黑 for(int i = 0;i<InfoHeader.biHeight;i++){ if(i>100&&i<300) bitMap[i][200]=0; } //使每一行的400列变黑 for(int i = 0;i<InfoHeader.biHeight;i++){ if(i>100&&i<300) bitMap[i][400]=0; } FILE*pfout=fopen("F:\\myPic.bmp","wb"); //写文件头 fwrite(&FileHeader,sizeof(FileHeader),1,pfout); //写信息头 fwrite(&InfoHeader,sizeof(InfoHeader),1,pfout); //写调色板 fwrite(IpRGBQuad,sizeof(RGBQUAD),256,pfout); //写像素点 fwrite(bitMap,sizeof(char),sizei,pfout); free(IpRGBQuad); fclose(fp); fclose(pfout); printf("------------------------正常结束---------------------------------\n"); system("pause"); return 0; }

 

posted @ 2018-09-25 18:49  一梦、  阅读(764)  评论(1编辑  收藏  举报