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 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...
随机推荐
- HDU 4512 吉哥系列故事——完美队形(LCIS)
Problem Description 吉哥这几天对队形比较感兴趣. 有一天,有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一 ...
- linux下MYSQL备份与恢复
1.用命令实现备份 数据库备份是很重要的.如果定期做好备份,这样就可以在发生系统崩溃时恢复数据到最后一次正常的状态,把损失减小到最少.MySQLl提供了一个mysqldump命令,我们可以用它进行数据 ...
- demo06
city_data.xml <?xml version="1.0" encoding="utf-8"?> <resources> < ...
- Spark K-Means
K-Means(K均值) 介绍 K-Means是被应用的最广泛的基于划分的聚类算法,是一种硬聚类算法,属于典型的局域原型的目标函数聚类的代表.算法首先随机选择k个对象,每个对象初始地代表一个簇的平均值 ...
- paper 35 :交叉验证(CrossValidation)方法思想
交叉验证(CrossValidation)方法思想简介 以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(da ...
- WCF和Web Service的 区(guan)别(xi)
参考文献:http://social.microsoft.com/Forums/zh-CN/c06420d1-69ba-4aa6-abe5-242e3213b68f/wcf-webservice 之前 ...
- YbRapidSolution.MVC项目首页分页没有起作用
@model YbRapidSolution.Mvc.Models.CmsPagerDataModel <nav> <ul class="pager"> & ...
- event对象的属性
事件类型: bubbles:布尔值,表示事件是否通过DOM以冒泡形式触发. 事件发生时,反应当前环境信息的属性: button: 表示(如果有)鼠标所按下的按钮 ctrlKey: 布尔值,表示Ctrl ...
- linux-批量重命名脚本
#!/bin/bash # rename jpg and png count= for img in *.jpg *.png do new=image-$count.${img#*.} mv > ...
- oracle热备份
1:热备份: SHUTDOWN IMMEDIATE; STARTUP MOUNT; alter database archivelog; --ALTER SYSTEM SET LOG_ARCHIVE_ ...