zoukankan      html  css  js  c++  java
  • 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(" ------------------------位图文件头---------------------------------------- "); fread(&FileHeader, sizeof(FileHeader), 1, fp); printf_s("文件类型%X ",FileHeader.bfType); printf_s("文件大小(单位字节):%lu ", FileHeader.bfSize); printf_s("备用:%X ", FileHeader.bfReserved1); printf_s("备用:%X ", FileHeader.bfReserved2); printf_s("图像开始处的字节偏移:%lu ", FileHeader.bfOffBits); //读取位图信息头 printf_s(" -------------------------位图信息头---------------------------------------- "); fread(&InfoHeader, sizeof(InfoHeader), 1, fp); printf_s("信息头大小:%lu ", InfoHeader.biSize); printf_s("图像宽度:%d ", InfoHeader.biWidth); printf_s("图像高度:%d ", InfoHeader.biHeight); printf_s("位平面数:%d ", InfoHeader.biPlanes); printf_s("每像素位数:%d ", InfoHeader.biBitCount); printf_s("压缩类型:%lu ", InfoHeader.biCompression); printf_s("压缩图像大小的字节数:%lu ", InfoHeader.biSizeImage); printf_s("水平分辨率:%ld ", InfoHeader.biXPelsPerMeter); printf_s("垂直分辨率:%ld ", InfoHeader.biYPelsPerMeter ); printf_s("使用的色彩数:%lu ", InfoHeader.biClrUsed); printf_s("重要色彩数:%lu ", InfoHeader.biClrImportant); //读取调色板数据 //printf_s(" -----------------------------调色板------------------------------------------ "); //printf_s(" 红 绿 蓝 "); fread(IpRGBQuad, sizeof(RGBQUAD), 256, fp); for (int i = 0; i < 256; i++) { //printf(" %X %X %X ",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("------------------------正常结束--------------------------------- "); system("pause"); return 0; }
  • 相关阅读:
    第七章读书笔记
    第八章读书笔记
    第五章读书笔记
    第六章读书笔记
    总结
    第四章读书笔记
    第十一章读书笔记
    第十章读书笔记
    第九章读书笔记
    第八章读书笔记
  • 原文地址:https://www.cnblogs.com/airduce/p/9702534.html
Copyright © 2011-2022 走看看