BMP文件总结
(诸多错误、谢谢指点 )
1、BMP文件结构由四部分组成
a、位图文件 头数据结构,包括BMP图形
文件的类型,显示内容等。
private int size;// 位图信息头所占用字节
数
b、位图信息数据结构 包含BMP图像的
宽,高,压缩方法以及定义颜色等信息
private int image_width;// 位图的宽度
private int image_height;// 位图的高度
private int image_size;// 位图的
大小
private int biXpelsPerMeter;// 水
平分辨率
private int biYpelsPerMeter;// 垂
直分辨率
private int biBitCount = 24;// 每
个像素所需的位数(1双色,4是16色,8是256色
,之一)
c、调色板,有些需要有些也不需要
d、位图数据 这根据BMP位图使用位数不同而不同;在24位图中直接使用RGB
private int Planes = 1;// 目标设备的级别,必须为1(26-27字节)
private int biClrUsed;// 位图实际使用的颜色中的颜色数
private int biClrImportant;// 位图显式过程中重要的颜色数
2、BMP数据结构
a、BMP文件头、包含文件的类型、文件大小、位图起始位置
//存储位图文件的类型
bfHead[0]='B';
bfHead[1]='M';
b、位图信息头:用于说明位图的尺寸等信息
int size;// 位图信息头所占用字节数
int image_width;// 位图的宽度
int image_height;// 位图的高度
int image_size;// 位图的大小
int biXpelsPerMeter;// 水平分辨率
int biYpelsPerMeter;// 垂直分辨率
biBitCount = 24;// 每个像素所需的位数(1双色,4是16色,8是256色,之一)
Planes = 1;// 目标设备的级别,必须为1(26-27字节)
biClrUsed;// 位图实际使用的颜色中的颜色数
biClrImportant;// 位图显式过程中重要的颜色数
c、颜色表:用于说明图中的颜色、
d、位图数据:记录位图每一个像素值,记录顺序是在扫描从左到右、从下到上
其实现过程如下:
1、声明文件的信息头
private int size;// 位图信息头所占用字节数
private int image_width;// 位图的宽度
private int image_height;// 位图的高度
private int image_size;// 位图的大小
private int biXpelsPerMeter;// 水平分辨率
private int biYpelsPerMeter;// 垂直分辨率
private int biBitCount = 24;// 每个像素所需的位数(1双色,4是16色,8是256色,之一)
private int Planes = 1;// 目标设备的级别,必须为1(26-27字节)
private int biClrUsed;// 位图实际使用的颜色中的颜色数
private int biClrImportant;// 位图显式过程中重要的颜色数
private byte[] info = new byte[40];// 定义数组,用于存储信息头的数据
2、文件宽、高保存:
public InfoHead_BMP(int image_width, int image_height) {
this.image_width = image_width;
this.image_height = image_height;
info[0] = 40;// 用四个字节存储文件的大小
// 位图宽度的保存
int value = image_width;
info[4] = (byte) value;
value = value >> 8;
info[5] = (byte) value;
value = value >> 8;
info[6] = (byte) value;
value = value >> 8;
info[7] = (byte) value;
value = value >> 8;
// 位图高度的保存
value = image_height;
info[8] = (byte) value;
value = value >> 8;
info[9] = (byte) value;
value = value >> 8;
info[10] = (byte) value;
value = value >> 8;
info[11] = (byte) value;
value = Planes;
info[12] = (byte) value;
info[14] = (byte) biBitCount;
3、图片存储数组:
// 一个像素有三个字节组成
// 但是image_size是int型,由4个字节组成,因此image_size必须是
image_size = image_width * image_height * 3;
/*
* 如果位图的宽度不能被3整除,则在后面补零 图片实际大小和占用空间大小的区别
*/
if (image_width % 4 != 0) {
image_size += (image_width % 4) * image_height * 3;
}
4、文件的写入:
public boolean BMPSave(String path,int[][] array) throws IOException{
boolean result=false;
//实例化输出流对象
FileOutputStream fos=new FileOutputStream(path);
//创建文件缓冲流
BufferedOutputStream bos=new BufferedOutputStream(fos);
//创建文件数据类型输入流
DataOutputStream dos=new DataOutputStream(bos);
//读入文件宽
dos.writeInt(array[0].length);
dos.writeInt(array.length);
//循环写入每个像素点颜色值
for(int i=0;i<array.length;i++){
for(int j=0;j<array[0].length;j++){
dos.writeInt(array[i][j]);
}
}
result=true;
dos.flush();
dos.close();
bos.close();
fos.close();
return result;
}
5、文件的保存:
public void SaveBMP(String path,BufferedImage bufferedIma) throws IOException{
//输出流对象
OutputStream os=new FileOutputStream(path);
//得到图片的宽和高
int image_width=bufferedIma.getWidth();
int image_height=bufferedIma.getHeight();
//保存图片的大小,图片的大小,即图片的像素
int image_size=image_width*image_height*3;
if(image_width%4!=0){
//补0
image_size+=(image_width%4)*image_height*3;
}
//定义存取RGB值的数组
byte[] RGBs=new byte[3];
//补0个数的数组
byte[] blank=new byte[image_width%4];
FileHead_BMP fileHead=new FileHead_BMP(image_size,54);//54是文件的偏移量
//1、写入文件头基本信息:文件的大小和偏移量
os.write(fileHead.fileHeadData());
//2、实例化文件位图信息头
InfoHead_BMP infoHead=new InfoHead_BMP(image_width,image_height);
//写入文件位图信息头信息:图片的宽、高和大小
os.write(infoHead.getData());
System.out.println();
/*
* 写入颜色表
*/
//像素计数器
int PixelsValue=0;
for(int y=image_height-1;y>=0;y--){
for(int x=0;x<image_width;x++){
PixelsValue+=3;
int RGB=bufferedIma.getRGB(x, y);
//将像素值转换成字节,存取到RGBs数组中
RGBs[0]=(byte)RGB;
RGB=RGB>>8;
RGBs[1]=(byte)RGB;
RGB=RGB>>8;
RGBs[2]=(byte)RGB;
//写入RGBs数据
os.write(RGBs);
//如果像素大小不是3的倍数,则将补的0写进去
if(((image_width%4)!=0)&&(PixelsValue%(image_width*3)==0)){
os.write(blank);
}
}
}
os.close();
}
6、文件的读取:
/BMP文件打开操作
public void BMPOpen(String path,int[][] array,DrawingPanel dp) throws IOException{
//创建文件输入流
FileInputStream fis=new FileInputStream(path);
//创建文件缓冲流
BufferedInputStream bis=new BufferedInputStream(fis);
//创建文件数据类型输入流
DataInputStream dis=new DataInputStream(bis);
int width=dis.readInt();
int height=dis.readInt();
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
array[i][j]=dis.readInt();
}
}
//关闭流
//dis.flush();
dis.close();
bis.close();
fis.close();
dp.repaint();
}
7、文件的打开:
public int[][] OpenBMP(String path) throws IOException{
//创建文件输入流
FileInputStream fis=new FileInputStream(path);
//创建文件缓冲流
BufferedInputStream bis=new BufferedInputStream(fis);
//创建文件数据类型输入流
DataInputStream dis=new DataInputStream(bis);
//读入BMP文件头信息
int bflen=14;
byte bf[]=new byte[bflen];
dis.read(bf,0,bflen);
//读入位图信息头
byte[] bi=new byte[40];
dis.read(bi,0,40);
//获取一些重要信息,图形的长与宽
int image_width=changeInt(bi,7);//宽
int image_height=changeInt(bi,11);//高
//位数
int nbitCount=((int)bi[14]&0xff)<<8|(int)bi[14]&0xff;
//源图大小
int nSizeImage=changeInt(bi,23);
int skip_width=0;
DrawingPanel.value_color=new int[image_height][image_width];
/*
*判断是否补0
*/
if(image_width*3%4!=0){
skip_width=4-image_width*3%4;//补0
}
//装载RGB颜色数据数组
imageR =new int[image_height][image_width];
imageG=new int[image_height][image_width];
imageB=new int[image_height][image_width];
for(int h=image_height-1;h>0;h--){
System.out.println("image_width>>>"+image_width+" " +
" image_height>>>"+image_height);
for(int w=0;w<image_width;w++){
//分别读入B,G,R,倒着读
int blue=dis.read();
int green=dis.read();
int red=dis.read();
System.out.println("blu="+blue+"green="+green+"red="+red);
imageR[h][w]=red;
imageG[h][w]=green;
imageB[h][w]=blue;
if(w==image_width-1){
//跳过补0项
System.out.println(dis.skipBytes(skip_width));
}
Color color=new Color(red,green,blue);
DrawingPanel.value_color[h][w]=color.getRGB();
}
}
//清空数据流
dis.close();
bis.close();
fis.close();
return DrawingPanel.value_color;
}
8、其中还需要字节和整形的转换:
a、字节转换成int型
public int changeInt(byte[] bi,int start){
return(((int)bi[start]&0xff)<<24)|
(((int)bi[start-1]&0xff)<<16)|
(((int)bi[start-2]&0xff)<<8)|
(((int)bi[start-3]&0xff));
}
b、int型转换成byte
public byte[] changeByte(int num){
byte b1=(byte)(num>>24);
byte b2=(byte)(num>>16);
byte b3=(byte)(num>>8);
byte b4=(byte)(num);
byte[] by={b4,b3,b2,b1};
return by;
}
分享到:
相关推荐
总结来说,生成BMP格式图片的关键在于理解和构造正确的文件结构,包括文件头、信息头和像素数据。通过编程语言实现这些结构并写入文件,我们可以自定义创建各种色彩和图案的BMP图像。在给定的压缩包中,`main.c`可能...
总结来说,这个“bmp格式转jpg格式工具”是为了方便用户将占用空间较大的BMP图像转换为更紧凑的JPG格式,以节省存储空间或适应网络环境。使用这样的工具,用户可以避免因为不正确的文件格式更改而导致的问题,同时还...
总结来说,"图像处理常用图片(BMP格式)"这一资源集合是一系列未经压缩的256*256像素大小的BMP图像,适用于教学、研究或开发用途,特别是在图像处理、机器学习和计算机视觉领域。这些图像的24位色彩深度和固定尺寸...
本文将通过一个简单的C++示例程序介绍如何使用OpenCV库将RAW格式的图像转换为BMP格式。 #### RAW格式简介 RAW格式通常是指由数字相机捕获的未经压缩或处理的图像数据。这些数据包含了传感器接收到的所有信息,并且...
总结一下,VB实现BMP到ICO的转换主要涉及以下几个关键知识点: - GDI+的使用,包括Bitmap、Icon和Image类 - 图像格式的理解,如BMP和ICO的特性 - 文件流操作,包括MemoryStream和FileStream - 错误处理,确保程序的...
BMP格式虽然简单且易于理解,但由于其不进行任何压缩,导致文件体积通常较大,在网络传输和存储空间有限的情况下并不理想。然而,对于需要高质量图像的应用场景,例如打印、图形设计等,BMP格式仍然是一个很好的选择...
尽管现在有许多更高效、更复杂的图像格式,但BMP格式以其简单明了的特点仍然在某些场合有着不可替代的作用。掌握BMP文件的结构有助于开发者更好地理解图像处理的基本原理,也为开发相关的图像处理工具提供了基础。
总结来说,实现“用vc打开BMP格式”的程序,你需要掌握以下几个关键知识点: 1. BMP文件格式的结构,包括BITMAPFILEHEADER和BITMAPINFOHEADER。 2. 使用fstream库读取二进制文件。 3. 理解色彩深度和像素数据的解析...
在深度学习中,将数据集转换为.bmp格式有时是为了简化读取过程,因为很多深度学习框架都支持直接处理这种格式的图像。 **数据预处理** 在使用MNIST数据集进行深度学习模型训练之前,通常会进行一些预处理步骤。...
总结来说,C++读取BMP格式图片涉及到文件I/O操作、结构体解析、位图格式理解以及可能的颜色转换。通过学习这些知识点,你可以实现自己的BMP读取程序,或者利用现有库进行更复杂的图像处理任务。
### vc++读取bmp格式图像的程序 #### 知识点概述 本篇文章将深入解析一个使用VC++编写的程序,该程序的功能是读取BMP格式的图像。BMP(Bitmap Image File Format)是一种标准的位图图像格式,由于其简单且无损的...
文件"16ɫλͼ2.bmp"和"4.png、1.png、6.png、3.png"可能包含了不同色彩模式或不同解析度的BMP图像,这些实例可以帮助我们直观地对比和理解各种图像在BMP格式下的差异。"BMP图像格式探索.docx"很可能是文档形式的...
### BMP文件格式详解 #### 一、概述 BMP(Bitmap File)是一种常见的图像文件格式,由Microsoft设计,广泛应用于Windows...未来随着技术的发展,BMP格式可能会继续演进,但其基本原理和结构仍然具有重要的参考价值。
本篇文章将详细探讨如何在MFC(Microsoft Foundation Classes)框架下显示BMP格式的图片,以及涉及的位深度处理。 首先,我们要理解BMP文件的结构。BMP文件由文件头、信息头和像素数据三部分组成。文件头包含了文件...
BMP文件格式虽然简单且易于处理,但由于其较大的文件体积,在实际应用中可能并不是最佳选择。然而,对于图像处理和分析等领域来说,BMP文件格式仍然是一个非常有价值的工具,因为它提供了高质量的图像存储,并且具有...
本篇文章将详细讲解如何解码BMP(Bitmap)格式的图片,以及涉及到的相关技术,包括BMP格式编解码、FAT文件系统中的Unicode支持以及如何在屏幕上显示.bmp图片。 首先,我们来理解BMP图片格式。BMP是一种无损的位图...
总结起来,C++Builder提供了一个强大且灵活的环境来处理BMP格式的图像,包括读取、定位、处理和保存。通过理解和运用TBitmap类以及相关的Canvas方法,开发者可以创建出各种复杂的图像处理应用。对于初学者来说,熟悉...
需要注意的是,BMP格式支持多种颜色深度,如1位、4位、8位、24位等,处理不同颜色深度的图像时,解析和生成色彩表的步骤会有所不同。同时,BMP文件格式不包含任何压缩,因此对于大尺寸的图像,文件大小可能会很大。 ...
BMP格式的特点是无压缩或可选压缩,支持单色、灰度以及各种彩色图像,其主要优点是图像质量高且跨平台兼容性好。 #### BMP文件结构概览 BMP文件通常包含以下几个部分: 1. **文件头**:固定大小为14字节,包含了...
本篇将详细介绍如何使用 C 语言,通过两步简单操作将 RAW 格式的图片转换为 BMP 格式。 第一步:理解 RAW 和 BMP 文件结构 1. RAW 文件:RAW 格式没有统一的标准,不同相机厂商有各自的格式。但一般来说,它包含...