bmp格式图片文件读取
C++读取bmp图片的例子
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h> #define WIDTHBYTES(x) ((x+31)/32*4)
#define my(x) ( ( (x + 31) & ~31) / 8) BITMAPFILEHEADER bf; //BMP文件头结构体
BITMAPINFOHEADER bi; //BMP信息头结构体 int i,j;
RGBQUAD *ipRGB; //颜色表
DWORD NumColors; //颜色表数目
unsigned char ** Imgdata; void read(char*);
void display();
void org(char*);
void gray(char*); void test()
{
DWORD LineByte;
DWORD ImgSize;
LineByte=(DWORD)my(bi.biWidth*bi.biBitCount); //计算位图的实际宽度并确保它为32的倍数
ImgSize=(DWORD)LineByte*bi.biHeight;
printf("LineByte is %d. \n", LineByte);
printf("ImgSize is %d. \n", ImgSize);
} int main()
{
char *filename;
filename="U616.bmp";
read(filename);
display();
test();
org("123.bmp");
free(Imgdata);
// printf("<2>");
// display();
free(ipRGB);
system("pause");
return ;
} void read(char* filename)
{
FILE* fp;
fp=fopen(filename,"rb");
if(fp == NULL)
{
printf("Open file error!");
exit();
} //读取信息头、文件头
fread(&bf,sizeof(BITMAPFILEHEADER),,fp);
fread(&bi,sizeof(BITMAPINFOHEADER),,fp); if (bi.biClrUsed != )
NumColors=(DWORD)bi.biClrUsed;
else
switch (bi.biBitCount)
{
case : NumColors=; break;
case : NumColors=; break;
case : NumColors=; break;
case : NumColors=; break;
} //分配调色板内存
ipRGB=(RGBQUAD *)malloc(NumColors*sizeof(RGBQUAD));
fread(ipRGB,sizeof(RGBQUAD),NumColors,fp); Imgdata=new unsigned char*[bi.biHeight]; //声明一个指针数组
if(bi.biBitCount==)
{
for ( i=(bi.biHeight)-;i>=;i--)
Imgdata[i]=new unsigned char[bi.biWidth*]; //每个数组元素也是一个指针数组 for ( i=(bi.biHeight)-;i>=;i--)
for(j=;j<bi.biWidth*;j++)
fread(&Imgdata[i][j],,,fp);//每次只读取一个1字节,存入数组
}
else
{
for ( i=(bi.biHeight)-;i>=;i--)
Imgdata[i]=new unsigned char[bi.biWidth]; for ( i=(bi.biHeight)-;i>=;i--)
for(j=;j<bi.biWidth;j++)
fread(&Imgdata[i][j],,,fp);
} fclose(fp);
} void org(char *filename)
{
FILE* fp;
fp=fopen(filename,"wb");
fwrite(&bf,sizeof(BITMAPFILEHEADER),,fp); //写文件头
fwrite(&bi,sizeof(BITMAPINFOHEADER),,fp); //写信息头
fwrite(ipRGB,sizeof(RGBQUAD),NumColors,fp);//写颜色头 if(bi.biBitCount==)
for (i=(bi.biHeight)- ;i>=;i--)
for (j= ;j<my(bi.biWidth*);j++)
fwrite(&Imgdata[i][j],,,fp);
else
for (i=(bi.biHeight)- ;i>=;i--)
for (j= ;j<bi.biWidth;j++)
fwrite(&Imgdata[i][j],,,fp);
fclose(fp);
} void gray(char *filename)
{
FILE* fp;
fp=fopen(filename,"wb");
/*
bf.bfOffBits=(DWORD)1078;
bi.biSizeImage=(DWORD)(bi.biWidth*bi.biHeight);
bf.bfSize=bi.biSizeImage+bf.bfOffBits;
bi.biBitCount=(WORD)8;
bi.biClrUsed=(DWORD)256;
bi.biClrImportant=(DWORD)256;
bi.biXPelsPerMeter=(LONG)0;
bi.biYPelsPerMeter=(LONG)0;
NumColors=(DWORD)bi.biClrUsed;
ipRGB=(RGBQUAD *)malloc(NumColors*sizeof(RGBQUAD));
*/
fwrite(&bf,sizeof(BITMAPFILEHEADER),,fp); //写文件头
fwrite(&bi,sizeof(BITMAPINFOHEADER),,fp); //写信息头
fwrite(ipRGB,sizeof(RGBQUAD),NumColors,fp);//写颜色头 char temp;
for (i=(bi.biHeight)- ;i>=;i--)
for (j= ;j<bi.biWidth*;j++)
if(j%==)
{
temp=(Imgdata[i][j]*+Imgdata[i][j+]*+Imgdata[i][j+]*)>>;
fwrite(&temp,,,fp);
}
else
{
fwrite(&temp,,,fp);
}
fclose(fp);
} void display()
{
printf("tagBITMAPFILEHEADER info is: %d\n",sizeof(BITMAPFILEHEADER));
printf("bfType is %d.\n", bf.bfType);
printf("bfSize is %d.\n", bf.bfSize);
printf("bfReserved1 is %d.\n", bf.bfReserved1);
printf("bfReserved2 is %d.\n", bf.bfReserved2);
printf("bfOffBits is %d.\n", bf.bfOffBits); printf("\ntagBITMAPINFOHEADER info is: %d\n",sizeof(BITMAPINFOHEADER));
printf("biSize is %d. \n", bi.biSize);
printf("biWidth is %ld.\n", bi.biWidth);
printf("biHeight is %ld.\n", bi.biHeight);
printf("biPlanes is %d. \n", bi.biPlanes);
printf("biBitCount is %d. \n", bi.biBitCount); //每像素所需位数
printf("biCompression is %d. \n", bi.biCompression);
printf("biSizeImage is %d. \n", bi.biSizeImage);
printf("biXPelsPerMerer is %ld.\n", bi.biXPelsPerMeter); //每米像素数
printf("biYPelsPerMerer is %ld.\n", bi.biYPelsPerMeter);
printf("biClrUsed is %d. \n", bi.biClrUsed);
printf("biClrImportant is %d. \n", bi.biClrImportant);
printf("\nNum of colors is %d. \n", NumColors);
}
bmp格式图片文件读取的更多相关文章
- UTF-8格式txt文件读取字节前三位问题
今天试着读取一份UTF-8格式的txt文件,内容如下 12345 但是每次读取之后转为String类型,输出字符串长度总是为6,并且第一位打印在控制台后不占任何空间. 经过debug查看字节码后发现, ...
- Bmp格式图片与16进制的互相转换简解 Python
BMP TO HEX 首先介绍Github上一个简单的Bmp转成16进制的py: https://github.com/robertgallup/bmp2hex 网上这种例子很多.思路也简单:将bmp ...
- 如何将位图格式图片文件(.bmp)生成geotiff格式图片?
一.位图格式信息 位图BITMAPINFOHEADER 与BITMAPFILEHEADER: 先来看BITMAPINFOHEADER,只写几个主要的 biSize包含的是这个结构体的大小(包括颜色表) ...
- Linux C语言解析并显示.bmp格式图片
/************************* *bmp.h文件 *************************/ #ifndef __BMP_H__ #define __BMP_H__ # ...
- Linux C语言解析.bmp格式图片并显示汉字
bmp.h 文件 #ifndef __BMP_H__ #define __BMP_H__ #include <unistd.h> #include <stdio.h> #inc ...
- C++ 输出PPM格式图片文件
PPM简介 学习图形学时为了直观地观察结果,需要输出图片,而PPM是一种最简单的图片格式,非常适合新手使用. PPM文件的内容大概是这样的: 第一行固定为P3,代表写入的是PPM格式的RGB图像,除此 ...
- 使用Aspose.Words将Word文档转换为Tiff格式图片文件
用Aspose组件的优点是操作Word文档不需要安装Office就可以实现. 首先需要引用Aspose.Words.dll,链接地址:链接:https://pan.baidu.com/s/1rJvjp ...
- [自制操作系统] BMP格式文件读取&图形界面系统框架/应用接口设计
本文将介绍在本人JOS中实现的简单图形界面应用程序接口,应用程序启动器,以及一些利用了图形界面的示例应用程序. 本文主要涉及以下部分: 内核/用户RW/RW调色板framebuffer共享区域 8bi ...
- PNG,JPEG,BMP,JIF图片格式详解及其对比
原文地址:http://blog.csdn.net/u012611878/article/details/52215985 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...
随机推荐
- linux tomcat 配置
http://www.cnblogs.com/xdp-gacl/p/4097608.html
- 夺命雷公狗---DEDECMS----22dedecms让A标签进入对应的内容页
我们的模版里的超链接都是写死的,这都是不符合实际网站的需求的,我们要将他让他边活的,而并非死的.. 我们首先要将前端给我们的内容页面的模版放到目标目录里面,但是我们的内容页的模版名叫啥呢?我们可以来查 ...
- 10个免费的PHP编辑器/开发工具
转自: http://www.iteye.com/news/22672 一个好的编辑器或开发工具,能够极大提高我们的开发效率.下面介绍10个免费.强大的PHP编辑器/开发工具.这些编辑器拥有调试器.增 ...
- 【SPFA】 最短路计数
最短路计数 [问题描述] 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式] 输入第一行包含2个正整数N,M,为图的顶点数与边数. ...
- 视频处理控件TVideoGrabber如何重新编码视频
TVideoGrabber中可以对音频.视频剪辑进行重新编码剪辑,多的朋友知道这个功能更点,但是具体操作上还是不是很熟悉,这里总结一下,主要步骤如下: 1.通过指定开始和停止的时间,可以简单的剪辑视频 ...
- ubunu下用命令设置壁纸
ubunu下用命令设置壁纸: gsettings set org.gnome.desktop.background picture-uri “file:[fileName]” eg:gsettings ...
- Perl 和 Python 的比较 【转】
转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&id=4662991&uid=608135 作为万年Perl 党表示最近开 ...
- Calendar的问题
1. include file is not work now. remove <!-- #include file="Calendar.js" -->, add &l ...
- minio-dotnet --云存储服务
inio是一家成立于2014年的生产开源云存储产品的新兴创业公司.这家创业公司是其创始人继Gluester之后的又一杰作,Gluester公司已经在2011年被Red Hat公司以1.36亿美元的价格 ...
- HDU 3887:Counting Offspring(DFS序+树状数组)
http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意:给出一个有根树,问对于每一个节点它的子树中有多少个节点的值是小于它的. 思路:这题和那道苹果树是一样 ...