存在很大很大的问题,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(); } }