`
MoonMonster
  • 浏览: 36585 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

BMP24位格式图片读取

    博客分类:
  • Java
阅读更多

存在很大很大的问题,1.读取后画在面板上的速度太慢;2.有些24位的bmp没发读出来。

 

先直接贴代码,问题再日后解决。

 

 

package com.ct.t20160103;

import java.awt.Color;
import java.awt.Graphics;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

import javax.swing.JFrame;

/**
 * @author Chalmers
 * @version 创建时间:2016年1月3日 下午2:00:20
 */
public class BMPTest extends JFrame {

	int image_width = 0;
	int image_height = 0;

	int imageR[][] = null;
	int imageG[][] = null;
	int imageB[][] = null;

	public BMPTest() {

		try {
			init();
		} catch (Exception e) {
			e.printStackTrace();
		}

		this.setBounds(0, 0, image_width, image_height);
		this.setVisible(true);
		setResizable(false);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//		repaint();
	}

	//获得画图所需要的数据
	public void init() throws Exception {
		// 获得图片数据
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
				"F://a.bmp"));
		// DataInputStream bis = new DataInputStream(new FileInputStream(
		// "F://a.bmp"));
		// 跳过前面14个字节
		int len = 14;
		byte[] b = new byte[len];
		bis.read(b);

		// 读取40个字节
		len = 40;
		b = new byte[len];
		bis.read(b);

		image_width = ChangeInt(b, 7); // 源图宽度
		image_height = ChangeInt(b, 11); // 源图高度

		showBMPData(bis);
	}

	// 将4个byte类型数据转换成1个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;
	}

	//获得图片中每一个像素点的数据
	//每一个像素点又三个byte类型数据组成,分别读取出来
	public void showBMPData(BufferedInputStream bis) throws IOException {
		//图片有多大,则构造多大的数组
		imageR = new int[image_width][image_height];
		imageG = new int[image_width][image_height];
		imageB = new int[image_width][image_height];

		//判断图片数据最后是否补0
		int skip_width = 0;
		if (!(image_width * 3 % 4 == 0)) {
			skip_width = 4 - image_width * 3 % 4;
		}

		//读取图片的每一个像素中的颜色的数据
		for (int h = image_height - 1; h >= 0; h--) {
			//要按顺序读取
			for (int w = 0; w < image_width; w++) {
				int b = bis.read();
				int g = bis.read();
				int r = bis.read();

				//将数据存放进数组
				imageR[h][w] = r;
				imageG[h][w] = g;
				imageB[h][w] = b;
				
				if (w == 0) {
					bis.skip(skip_width);
				}
			}
		}
	}

	@Override
	public void paint(Graphics g) {
		//在画图这个地方是很有问题,它是一个像素点一个像素点的画,导致速度很慢
		//待修改
		for (int i = 0; i < image_width; i++) {
			for (int j = 0; j < image_height; j++) {
				g.setColor(new Color(imageR[i][j], imageG[i][j], imageB[i][j]));
				g.fillOval(j, i, 1, 1);
			}
		}
	}

	public static void main(String[] args) throws Exception {

		new BMPTest();
	}
}

 

分享到:
评论

相关推荐

    c++读取bmp格式图片

    总结来说,C++读取BMP格式图片涉及到文件I/O操作、结构体解析、位图格式理解以及可能的颜色转换。通过学习这些知识点,你可以实现自己的BMP读取程序,或者利用现有库进行更复杂的图像处理任务。

    MFC 读取BMP格式图片

    本文将深入探讨如何使用MFC框架来读取并显示BMP格式的图片。 首先,我们需要理解MFC的基本架构。MFC是微软为Windows应用程序开发提供的一套C++类库,它封装了Windows API,使开发者可以更方便地创建用户界面和处理...

    用java读取bmp格式图片文件

    通过读取bmp格式文件的数据格式,用数组合理的读取后,重新画出该图片

    vc++读取bmp格式图片程序

    在VC++环境中,读取BMP格式图片是一项基础的图像处理任务。BMP(Bitmap)是一种未经压缩的图像文件格式,通常用于存储位图图像。本项目通过VC++实现了一个程序,可以读取BMP文件,并对其进行反色和扫描操作,还有...

    C语言读取BMP图片

    压缩包内包含报告及说明文档。源码环境是VC6,在VS内稍做修改之后也可运行。代码是我大一时所写,可能有部分不妥之处,欢迎指正。由于是比赛作品直接压缩上传,压缩包内包含作者信息、还望尊重作者,不喜勿喷,谢谢...

    24位BMP图片转565格式16位数组C文件代码

    24位BMP图片转565格式16位数组C文件代码,生成的代码用于嵌入式程序代码中图片文件显示,BMP图片以数组的形式保存并读取。代码可以用TC或VC编译使用

    bmp格式图片转换为raw格式

    BMP格式图片包含图像的元数据,如宽度(Width,W)、高度(Height,H)、颜色深度等,以及实际像素数据。RAW格式则更接近于相机传感器的数据,通常包含每个像素的红、绿、蓝分量,没有预处理或色彩空间转换。 要...

    BMP文件分析及用python读取

    一、BMP文件分析 1. 什么是BMP(位图)? 常见的图像文件格式有:BMP、JPG...BMP格式的图片,没有使用任何压缩算法,这种方式在以前使用的比较多,现在用的就比较少了,不过为了学习图像处理算法,所以先以该种格式的文

    读取bmp图片输出RGB值

    本话题将深入探讨如何读取BMP格式的图片,并从中提取RGB(Red, Green, Blue)颜色信息,然后将这些信息输出到TXT文件中。 RGB色彩模型是计算机图形学中广泛使用的颜色模型,它通过红、绿、蓝三种基本颜色的不同强度...

    32位bmp转24位bmp

    5. **写入24位BMP文件**:转换完成后,需要将新数据写入新的BMP文件,遵循24位BMP的文件格式标准,包括重新构建文件头和信息头。 6. **错误处理**:在读写文件和内存操作时,应考虑可能出现的异常情况,如内存不足...

    图片转换工具(jpg转8位bmp,24位bmp转8位bmp)

    本工具专注于将图片从一种格式转换为另一种,特别是JPEG(jpg)与不同位深度的Bitmap(bmp)之间的转换。以下是关于这个主题的详细知识: 1. **JPEG与Bitmap格式**: JPEG(Joint Photographic Experts Group)是...

    24位BMP转32位BMP

    1. **读取源文件**:首先,我们需要使用Bitmap类的构造函数,传入24位BMP文件的路径来创建一个Bitmap对象,代表源图像。 ```csharp Bitmap sourceBitmap = new Bitmap("原始24位BMP文件路径"); ``` 2. **创建目标...

    读取bmp文件信息头文件

    就是用c语言读取一副bmp图像文件的信息头信息

    BMP图片24位深度转16位深度

    1. **读取24位BMP图像**:首先,程序需要读取24位BMP图像的文件头信息,包括图像宽度、高度、位深度等,然后解析图像数据,将其按行存储在内存中。 2. **颜色空间转换**:24位BMP图像采用RGB色彩模型,即每个像素由...

    Java读取所有色bmp图片格式

    本篇文章将深入讲解如何使用Java来读取不同颜色深度的BMP图像,包括1位、4位、8位和24位的BMP文件,并介绍一个名为`BmpUtil`的工具类。 首先,我们需要理解BMP文件的基本结构。BMP文件由文件头、信息头和像素数据三...

    24位色BMP格式图片生成数组小工具

    标题中的“24位色BMP格式图片生成数组小工具”是一个实用程序,它能够将24位彩色的BMP图像文件转换成C语言数组,以便于在编程项目中直接引用和显示这些图像。这个小工具对于那些需要在嵌入式系统、游戏开发或者任何...

    vb6直接读取bmp图片显示的源码 vb6分析bmp图片 vb6处理bmp图片

    在VB6(Visual Basic 6)中,读取并显示BMP(Bitmap)图片涉及到图形图像处理的基础知识,包括理解BMP文件格式、内存管理以及控件的使用。以下将详细讲解这些知识点。 首先,BMP是一种无损的位图格式,它存储了图像...

    linux下bmp24位转16位

    在Linux环境下,将一个24位的BMP(Bitmap)图像转换为16位的BMP格式是一项常见的图像处理任务。BMP是一种无损的图像文件格式,它以位(bits)来存储像素颜色信息。24位BMP每个像素由红、绿、蓝三个颜色通道组成,每...

    C++读取保存BMP图像

    在本文中,我们将深入探讨如何使用C++编程语言来读取和保存BMP(Bitmap)图像,特别是8位和24位的BMP格式。同时,我们还将学习如何将图像转换为灰度图,所有这些操作都不会依赖于任何现有的图像处理库。这个实现具有...

Global site tag (gtag.js) - Google Analytics