Bitmap 图片格式并用 C++ 读写 Bitmap
转自 Bitmap 图片格式并用 C++ 读写 Bitmap
1、Bitmap 图片格式
每部分的具体内容就不展开了。要说的有两点:
(1)调色板不是必须的,可有可无,有没有调色板可以通过位图文件头的 bfOffBits 是否等于位图文件头加上位图信息头的长度来判断。调色板这个问题也曾经导致我在用 C++ 读取 BMP 的时候出错,原因就是并不是每个图片都没有调色板的,我读取的开始位置错了。
(2)windows 的 BMP 是从最后一行开始读的!这个问题曾经导致我在用 C++ 做图像的旋转时方向错误。
2、C++ 读取 Bitmap 图片
#include <stdio.h> #include <stdlib.h> #include <windows.h> typedef struct { BYTE b; BYTE g; BYTE r; }RGB; void imgOpr(RGB &a,RGB &b) { b.b=a.b; b.g=a.g; b.r=a.r; } int main() { BITMAPFILEHEADER fileHeader; BITMAPINFOHEADER infoHeader; FILE* pfin =fopen("D:/1.bmp","rb"); FILE* pfout = fopen( "D:/2.bmp" , "wb"); //Read the Bitmap file header; fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin); //Read the Bitmap info header; fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin); //为简化代码,只处理24位彩色 int height,weight; height=0; weight=0; height=infoHeader.biHeight; weight=infoHeader.biWidth; if( infoHeader.biBitCount >= 1) { int size = height * weight; RGB img[height][weight]; RGB img2[weight][height]; fread( img , sizeof(RGB) , size , pfin ); //对图片进行操作 int i, j; for (i=0; i<height; i++) for (j=0 ; j < weight ; j++ ) { //将数组 img 赋值给 img2 imgOpr(img[i][j],img2[i][j]); } //将修改后的图片保存到文件 fwrite( &fileHeader , sizeof(fileHeader) , 1 , pfout ); fwrite( &infoHeader , sizeof(infoHeader) , 1 , pfout ); fwrite( img2 , sizeof(RGB) , size , pfout ); } fclose(pfin); fclose(pfout); return 0; }
你们的评论、反馈,及对你们有所用,是我整理材料和博文写作的最大的鼓励和唯一动力。欢迎讨论和关注!
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。