import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import javax.swing.JFrame;
/**
* 打开BMP格式图片的程序
*
* @author XiongMinghua
*
* 主函数
*/
public class OpenBMP extends JFrame {
public static void main(String[] args) {
OpenBMP obmp = new OpenBMP();
String path = "D:\\My Documents\\StudySample\\src\\images\\Sunset.bmp";
obmp.openFile(path);
}
private void openFile(String path) {
try {
// 创建文件输入流
FileInputStream fis = new FileInputStream(path);
// 把文件输入流包装成输入缓冲流
BufferedInputStream bis = new BufferedInputStream(fis);
// 读入BMP头文件的基本信息
int bflen = 14;
byte[] bf = new byte[bflen];
bis.read(bf, 0, bflen);// 读取14字节的BMP文件头
// 读入位图信息头
int bilen = 40;
byte[] bi = new byte[bilen];
bis.read(bi, 0, bilen);// 读取40字节的BMP位图信息头
/**
* 获取一些重要信息: 位图的宽度、高度、每个像素点所需的位数(即图像的深度)、源图大小(测试时值为0)
*/
image_width = changeInt(bi, 7);// 源图宽度
image_height = changeInt(bi, 11);// 源图高度
// 每个像素所需的位数,必须是1(双色)、4(16色)、8(256色)、24(真彩色)之一,(29-30字节)
biBitCount = (((int) bi[15] & 0xff) << 8) | ((int) bi[14] & 0xff);
sizeImage = changeInt(bi, 23);// 位图的大小,以字节为单位(35-38字节),测试结果为sizeImage=0;
// 调用读取位图数据的方法,将数据存入imageR, imageB, imageG三个二维数组中
readRGB(bis);
// 关闭流
bis.close();
fis.close();
showUI(path);
} catch (Exception e) {
e.printStackTrace();
}
}
// 读取位图数据的方法
public void readRGB(BufferedInputStream bis) {
if (!(image_width * 3 % 4 == 0)) {
skip_width = 4 - image_width * 3 % 4;
}
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--) {
for (int w = 0; w < image_width; w++) {
int blue;
try {
blue = bis.read();// 先读取出蓝色
int green = bis.read();// 接着读取出绿色
int red = bis.read();// 最后读取的是红色
imageR[h][w] = red;
imageG[h][w] = green;
imageB[h][w] = blue;
} catch (IOException e) {
e.printStackTrace();
}
if (w == 0) {
// 跳过补0项
try {
bis.skip(skip_width);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
// 显示窗体的方法
void showUI(String path) {
this.setTitle(path);
this.setSize(image_width, image_height);
this.setDefaultCloseOperation(3);
this.setVisible(true);
this.getGraphics();
repaint();// 调用重绘方法
}
// 重绘方法
public void paint(java.awt.Graphics g) {
super.paint(g);// 调用父类的重绘方法
for (int h = 0; h < image_height; h++) {
for (int w = 0; w < image_width; w++) {
g.setColor(new java.awt.Color(imageR[h][w], imageG[h][w],
imageB[h][w]));
g.drawLine(w, h, w, h);
}
}
}
private int changeInt(byte[] bi, int i) {
return (((int) bi[i] & 0xff) << 24) | (((int) bi[i - 1] & 0xff) << 16)
| (((int) bi[i - 2] & 0xff) << 8) | (((int) bi[i - 3] & 0xff));
}
/**
* 1.BMP文件头(占14个字节)
*/
int bfType;// 位图文件类型,占两个字节,第一个字节为字母'B',第二个字节为字母'M'(1-2字节)
int bfSize;// 位图文件的大小,以字节为单位(3-6字节)
// 第7-10字节为位图的保留字,其Int值为0
// 位图数据的起始位置,以相对与位图(11-14字节)
int bfOffBits;
/**
* 2.位图信息头(占40字节)
*/
int size;// 位图信息头所占用字节数,为40个字节(15-18字节)
int image_width;// 位图的宽度,以像素为单位(19-22字节)
int image_height;// 位图的高度,以像素为单位(23-26字节)
int planes;// 目标设备的级别,必须为1(27-28字节)
int biBitCount;// 每个像素所需的位数,必须是1(双色)、4(16色)、8(256色)、24(真彩色)之一,(29-30字节)
int biCompression;// 位图压缩类型,必须是0(不压缩)、1(BI_RLE8压缩类型)、2(BI_RLE4压缩类型)之一。(31-34字节)
int sizeImage;// 位图的大小,以字节为单位(35-38字节)
int biXPelsPerMeter;// 位图水平分辨率,每米像素数(39-42字节)
int biYPelsPerMeter;// 位图垂直分辨率,每米像素数(43-46字节)
int biClrUsed;// 位图实际使用的颜色表中的颜色数(47-50字节)
int biClrImportant;// 位图显示过程中重要的颜色数(51-54字节)
// 跳过补0项
int skip_width;
/**
* 颜色表
* 颜色表中的RGBQUAD结构数据的个数由biBitCount来确定。当biBitCount分别取1,4,8时,分别有2,16,256个表项;
* 当biBitCount=24时,没有颜色表项
*/
class RGBQUAD {
byte rgbBlue;// 蓝色的深度(值范围为0-255)
byte rgbGreen;// 绿色的深度(值范围为0-255)
byte rgbRed;// 红色的深度(值范围为0-255)
byte rgbReserved;// 保留,必须为0
}
// 用于存储RGB颜色数据的数组
int[][] imageR, imageB, imageG;
}
分享到:
相关推荐
总结来说,"打开BMP图像程序"项目涵盖了以下核心知识点: 1. BMP文件格式的理解,包括文件头、信息头和像素数据的结构。 2. 使用C++标准文件I/O操作读取BMP文件。 3. 解析图像尺寸、颜色深度等信息,并根据这些信息...
总之,`VC打开bmp图片程序`是一个利用MFC中的`CDib`类实现的简单图像查看器。它展示了如何在C++环境中读取和显示BMP格式的图片,为开发者提供了图形界面编程的基础知识。通过深入理解和运用这些概念,开发者可以...
在本文中,我们将深入探讨如何使用OpenCV库打开BMP图像。OpenCV(开源计算机视觉库)是一个功能强大的工具,广泛应用于图像处理和计算机视觉领域。BMP是一种常见的位图图像格式,它不包含任何压缩,因此对于快速读取...
在本项目中,我们主要关注的是“BMP图像显示和处理程序”的开发,这是一个使用VC++(Visual C++)作为编程环境的课程设计任务。BMP(Bitmap)是一种常见的位图图像格式,广泛用于Windows操作系统中。下面我们将深入...
运行程序后,用户可以通过“打开”菜单选择BMP文件,程序会读取文件内容,判断其格式,然后在内存中加载图像数据。在成功加载后,用户点击“显示原图”菜单,`OnYuantu`函数被调用,最终在视图中调用`OnDraw`,显示...
在Windows操作系统中,BMP文件通常可以直接被系统支持,但如果你想在自定义的程序中打开并显示BMP文件,就需要进行一些编程操作。本篇文章将详细讲解如何在VC++环境中打开并显示BMP文件,主要涉及MFC(Microsoft ...
2. **打开文件**:使用`fopen()`函数打开BMP文件,一般以二进制模式("rb"或"wb")进行读写。 3. **读取文件头**:通过`fread()`函数读取文件头数据,然后解析这些数据以获取图像的基本信息。 4. **分配内存**:...
总结起来,打开BMP格式图像文件在MFC中主要涉及CFile、CBitmap和CImage类的使用,以及GDI函数的调用。通过创建DIB类,我们可以更好地管理和操作BMP图像,实现各种图像处理功能。在实际编程过程中,根据项目需求,你...
在提供的源程序中,初学者可以学习如何使用C语言的I/O函数解析BMP文件头,理解位图数据的存储方式,并实现读取图像显示或写入新图像的功能。通过实践这些代码,不仅可以加深对C语言的理解,还能为后续的图像处理和...
软件最主要有向左旋转90度、向右旋转90度、旋转180度和对图像进行锐化处理,处理完后能对图像进行保存和显示操作,该软件还具有打开任何一个BMP图片的功能,同时也具有另存为其他文件名称的功能。 这个软件是利用...
标题"打开和保存bmp图片的小程序"暗示我们要实现的功能是读取BMP文件的内容并将其显示出来,同时还能将用户编辑的图像保存为BMP格式。DIB句柄在此过程中起着至关重要的作用,因为它提供了与硬件无关的方式来表示图像...
在VC++6.0开发环境中,BMP(Bitmap)是一种常见的图像文件格式,它用于存储位图图像。...通过熟练掌握这些技术,你可以轻松地在你的应用程序中添加BMP图像的读取和显示功能,为用户带来更丰富的视觉体验。
如果一切正确,程序应该能够打开指定的BMP文件并在控制台上显示。 6. **处理灰度图和彩图**: BMP文件可以是8位、24位或其他颜色深度。8位BMP通常用于灰度图,而24位BMP用于彩色图。处理不同颜色深度的BMP时,需...
- 打开BMP文件,读取图像的头信息,包括宽度、高度和颜色深度。 - 遍历图像的每一行,从底部到顶部,因为BMP文件通常以从左到右、从下到上的顺序存储像素。 - 对于每个像素,获取其RGB值,并进行取反操作:新R = ...
在这个场景中,我们关注的是如何在对话框中的Picture控件(通常是CStatic或CMFCToolBarImageControl)显示 BMP 图片,并提供一个功能让用户能够点击按钮打开新的图像,同时还能实现图片的另存。以下是一些关键知识点...
1. 创建一个`CFile`对象,并使用`Open`函数打开BMP文件。记得提供正确的文件路径,通常是从资源文件或用户指定的路径获取。 2. 使用`CBitmap`对象的`CreateFromHandle`方法,传入`CFile`对象的句柄来加载BMP图像。这...
在“linux下bmp图像显示”的程序中,首先需要解析BMP文件的头部信息,获取图像的尺寸和颜色深度,然后读取像素数据。由于BMP文件是从底部开始存储的,而在framebuffer中,屏幕是从顶部开始绘制的,因此在写入...
在VC++编程环境中,开发人员经常需要在对话框中显示图像,例如BMP格式的图片。这个场景在GUI应用程序中非常常见,用于增强用户界面的视觉效果。标题“对话框打开指定路径的bmp图像”表明我们要讨论的是如何通过编程...
在嵌入式Linux系统中,framebuffer是一种基本的图形设备驱动程序,它为操作系统提供了一个直接访问硬件显存的接口,使得我们可以在没有图形窗口系统(如X Window System)的情况下进行图形显示。在这个主题中,我们...
.rar] - bmp转换为jpeg,jpeg压缩的源代码 程序用vc实现了bmp图片转换成jpeg图片 [bmpfor3.rar] - 从文件读取并显示bmp位图,然后保存 [运用Opengl和C实现一个人体面部的三维显示.rar] - 通过VC++和OPenGL实现人脸...