24位和8位BMP图片保存纯C代码
BMP图片大家都知道,可以通过查看BMP图片结构使用纯C就可以打开,编辑,处理,保存图片。非常方便使用。
具体BMP结构可以参考:wingdi.h头文件。今天主要在进行删减代码,需要把多余的代码删除,之前写的保存bmp代码就此贴在这里留着以后需要的时候使用:
8位BMP图片保存代码:
BOOL SaveMatrixToGrayBmp(char* sBMPFile, //name of BMP file
BYTE *pMatrix, // pointer to Matrix Bits array
int bmpWidth ,
int bmpHeight // width and height of the bmp
)
{
FILE* fp;
int bytesofScanLine,i,j; DWORD dwFileSize;
BITMAPFILEHEADER bmfHeader;
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[];
BYTE tempb=; fp = fopen(sBMPFile, "wb");
bytesofScanLine=(bmpWidth % ==) ? bmpWidth: ((bmpWidth+)/*);
dwFileSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*+bytesofScanLine*bmpHeight; bmfHeader.bfType=((WORD) ('M' << ) | 'B');
bmfHeader.bfSize=dwFileSize;
bmfHeader.bfReserved1=;
bmfHeader.bfReserved2=;
bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*; fwrite(&bmfHeader,sizeof(bmfHeader), , fp); // fill the bmp file Infomation Header.
bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth=bmpWidth;
bmiHeader.biHeight=bmpHeight;
bmiHeader.biPlanes=;
bmiHeader.biBitCount=;
bmiHeader.biCompression=BI_RGB;
bmiHeader.biSizeImage=;
bmiHeader.biXPelsPerMeter=;
bmiHeader.biYPelsPerMeter=;
bmiHeader.biClrUsed=;
bmiHeader.biClrImportant=; fwrite(&bmiHeader,sizeof(bmiHeader), , fp); // fill the color tables.
for (i=; i< ; i++)
{
bmiColors[i].rgbBlue=(BYTE)(i);
bmiColors[i].rgbGreen=(BYTE)(i);
bmiColors[i].rgbRed=(BYTE)(i);
bmiColors[i].rgbReserved=;
} fwrite(&(bmiColors[]),sizeof(RGBQUAD)*, , fp); // fill the BMP data to file
for (j=bmpHeight- ; j>= ; j--)
{
fwrite((pMatrix+(j*bmpWidth)), , bmpWidth, fp);
for (i=; i<(bytesofScanLine-bmpWidth) ; i++)
fwrite(&tempb, , , fp);
} fclose(fp);
return true;
}
24位BMP图片保存代码:
BOOL SaveRGBMatrixToColorBmp(char* sBMPFile, //name of BMP file
BYTE *pRGBMat, // pointer to DIB bits array
int bmpWidth ,//width of the bmp
int bmpHeight // height of the bmp
)
{
// create the empty 24bit color BMP file
FILE* fp;
fp = fopen(sBMPFile, "wb");
DWORD dwFileSize;
BITMAPFILEHEADER bmfHeader;
BITMAPINFOHEADER bmiHeader; int bytesofScanLine,i,j;
bytesofScanLine=((bmpWidth*) % ==) ? (bmpWidth*): (*int(bmpWidth*/)+) ;
dwFileSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)
+bytesofScanLine*fabs((double)bmpHeight); // fill the bmp file Header;
bmfHeader.bfType=((WORD) ('M' << ) | 'B');
bmfHeader.bfSize=dwFileSize;
bmfHeader.bfReserved1=;
bmfHeader.bfReserved2=;
bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)
fwrite(&bmfHeader,sizeof(bmfHeader), , fp); // fill the bmp file Infomation Header.
bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth=bmpWidth;
bmiHeader.biHeight= fabs((double)bmpHeight);
bmiHeader.biPlanes=;
bmiHeader.biBitCount=;
bmiHeader.biCompression=BI_RGB;
bmiHeader.biSizeImage=;
bmiHeader.biXPelsPerMeter=;
bmiHeader.biYPelsPerMeter=;
bmiHeader.biClrUsed=;
bmiHeader.biClrImportant=;
fwrite(&bmiHeader,sizeof(bmiHeader), , fp); // fill the BMP data to file
BYTE dummy = ;
BYTE tempb=;
for (j=fabs((double)bmpHeight)-; j>= ; j--)
{
fwrite((pRGBMat+j**bmpWidth), bmpWidth*, , fp);
if (bmpWidth* != bytesofScanLine)
{
for (i = ; i<bytesofScanLine - bmpWidth*; i++)
fwrite(&dummy, , , fp);
} }
fclose(fp);
return true;
}
使用例子:
SaveMatrixToGrayBmp("./mid/Gray.bmp", Gray, iWidth, iHeight)
SaveRGBMatrixToColorBmp("./mid/Img.bmp", Img, iWidth, iHeight)
24位和8位BMP图片保存纯C代码的更多相关文章
- Android系统移植与调试之------->如何使用PhotoShop转换24位的bmp图片为16位bmp图片
使用Android移植时候,很多图片都需要16为的bmp格式,所以研究了一下如何从24位转换成16位,供大家参阅 step1:查看bmp图片的属性,如下图所示,是24位的 step2:用PhotoSh ...
- C#图片灰度处理(位深度24→位深度8)、C#图片二值化处理(位深度8→位深度1)
C#图片灰度处理(位深度24→位深度8) #region 灰度处理 /// <summary> /// 将源图像灰度化,并转化为8位灰度图像. /// </summary> / ...
- Photoshop做32位带Alpha通道的bmp图片
原文链接: http://blog.sina.com.cn/s/blog_65c0cae801016e5u.html 批量制作32位带Alpha通道的bmp图片,可以制作一个动作,内容可以如下: ...
- 【VC++技术杂谈006】截取电脑桌面并将其保存为bmp图片
本文主要介绍如何截取电脑桌面并将其保存为bmp图片. 1. Bmp图像文件组成 Bmp是Windows操作系统中的标准图像文件格式. Bmp图像文件由四部分组成: (1)位图头文件数据结构,包含Bmp ...
- Windows 保存BMP图片
在Windows下保存BMP图片还是挺方便的,直接上代码,拷贝就能用 void savebmp(uchar * pdata, char * bmp_file, int width, int heigh ...
- 图像转置的SSE优化(支持8位、24位、32位),提速4-6倍。
一.前言 转置操作在很多算法上都有着广泛的应用,在数学上矩阵转置更有着特殊的意义.而在图像处理上,如果说图像数据本身的转置,除了显示外,本身并无特殊含义,但是在某些情况下,确能有效的提高算法效率,比如 ...
- SSE图像算法优化系列四:图像转置的SSE优化(支持8位、24位、32位),提速4-6倍
一.前言 转置操作在很多算法上都有着广泛的应用,在数学上矩阵转置更有着特殊的意义.而在图像处理上,如果说图像数据本身的转置,除了显示外,本身并无特殊含义,但是在某些情况下,确能有效的提高算法效率,比如 ...
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的測试,图像格式png,jpg, gif等等測试均O ...
- [转]RGB数据保存为BMP图片
转自:http://blog.csdn.net/yixianfeng41/article/details/52591585 一.BMP文件由文件头.位图信息头.颜色信息和图形数据四部分组成. 1.BM ...
随机推荐
- bzoj 1020-1029
1020 SHOI2008 安全的航线flight 这题的代码写了很久,主要是因为几何题的东西都忘得差不多了.除去写代码的2个小时,今晚又调了一晚上,终于AC了. 这题的做法还是很有参考价值的. 最简 ...
- codeforces 316F3 Suns and Rays
题目在此 找出中有多少个太阳以及每个太阳的散发线段. 算法 原图: 将图"缩小",如果一个白点的四周有黑点,那么把这个白点变成黑点: 将图"放大",即上述&qu ...
- What’s new in Spark 1.2.0
What's new in Spark 1.2.0 1.2.0 was released on 12/18, 2014 在2014年5月30日公布了Spark 1.0 和9月11日公布了Spark1. ...
- jQuery操作checkbox的问题
问题: 使用 jquery 的 attr('checked',false) 和 attr('checked',true) 方法给 checkbox 设置选中和未选中状态时,失效. 原因: jquery ...
- 使用ExifInterface获取图片信息
package com.example.readimage; import java.io.IOException; import android.media.ExifInterface; impor ...
- 动态绑定Gridview带模板列
公司要做一个可以支持4种数据库(<!--数据库类型 (DLL专用) (SQL SERVER) (ORACLE) (ACCESS)(POSTGRE SQL)-->)的并且字段随表字段变化的可 ...
- perl学习(8) 控制:unless,until,next,redo,last
Perl中实现了所有C 的操作符! Perl力求代码最少! 1.1.unless unless的含义是:除非条件为真,否则执行块中的代码,和if正好相反 unless($fred=~ /^[A-Z_] ...
- 最简单的基于FFMPEG+SDL的视频播放器 ver2 (採用SDL2.0)
===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...
- File Templates for web.xml & web-fragment.xml (Servlet 2.3, 2.4, 2.5 + 3.0)
As I sometimes need these, I have compiled a list of the valid headers of the web.xml and web-fragme ...
- Linux/ubuntu下的boost库安装
我一直都没有写博客的习惯,最近正好在研究linux下的开发(目前也只是粗粗的研究),且用到了boost库,就乘此机会写点什么,最起码记录一下我在安装boost的一些步骤,主要给和我一样的linux开发 ...