当前位置: 代码迷 >> Java相关 >> 谁能给我一段用Java 加载和显示BMP(位图)的代码?
  详细解决方案

谁能给我一段用Java 加载和显示BMP(位图)的代码?

热度:306   发布时间:2007-03-21 08:21:40.0
谁能给我一段用Java 加载和显示BMP(位图)的代码?
本人最近想用java做一些关于图像处理的程序,不知道怎样在Java中加载位图.希望大家帮个忙....
搜索更多相关的解决方案: 位图  BMP  加载  Java  代码  

----------------解决方案--------------------------------------------------------
JAVA不认识BMP
----------------解决方案--------------------------------------------------------
有其他的办法没有!!
----------------解决方案--------------------------------------------------------
当然有,可以把BMP转成JAVA认识的格式

----------------解决方案--------------------------------------------------------

你可以用JIMI
http://java.sun.com/products/jimi/

当然你要想自己写代码也可以,比较麻烦。我在网上给你COPY了一个:
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.MemoryImageSource;
import java.io.FileInputStream;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;

public class BMPLoader

{
public static int constructInt(byte[] in, int offset) {

int ret = ((int) in[offset + 3] & 0xff);

ret = (ret << 8) | ((int) in[offset + 2] & 0xff);

ret = (ret << 8) | ((int) in[offset + 1] & 0xff);

ret = (ret << 8) | ((int) in[offset + 0] & 0xff);

return (ret);

}
public static int constructInt3(byte[] in, int offset) {

int ret = 0xff;

ret = (ret << 8) | ((int) in[offset + 2] & 0xff);

ret = (ret << 8) | ((int) in[offset + 1] & 0xff);

ret = (ret << 8) | ((int) in[offset + 0] & 0xff);

return (ret);

}
public static long constructLong(byte[] in, int offset) {

long ret = ((long) in[offset + 7] & 0xff);

ret |= (ret << 8) | ((long) in[offset + 6] & 0xff);

ret |= (ret << 8) | ((long) in[offset + 5] & 0xff);

ret |= (ret << 8) | ((long) in[offset + 4] & 0xff);

ret |= (ret << 8) | ((long) in[offset + 3] & 0xff);

ret |= (ret << 8) | ((long) in[offset + 2] & 0xff);

ret |= (ret << 8) | ((long) in[offset + 1] & 0xff);

ret |= (ret << 8) | ((long) in[offset + 0] & 0xff);

return (ret);

}
public static double constructDouble(byte[] in, int offset) {

long ret = constructLong(in, offset);

return (Double.longBitsToDouble(ret));

}
public static short constructShort(byte[] in, int offset) {

short ret = (short) ((short) in[offset + 1] & 0xff);

ret = (short) ((ret << 8) | (short) ((short) in[offset + 0] & 0xff));

return (ret);

}
static class BitmapHeader {

public int nsize;

public int nbisize;

public int nwidth;

public int nheight;

public int nplanes;

public int nbitcount;

public int ncompression;

public int nsizeimage;

public int nxpm;

public int nypm;

public int nclrused;

public int nclrimp;

// read in the bitmap header
public void read(FileInputStream fs) throws IOException

{

final int bflen = 14; // 14 byte BITMAPFILEHEADER

byte bf[] = new byte[bflen];

fs.read(bf, 0, bflen);

final int bilen = 40; // 40-byte BITMAPINFOHEADER

byte bi[] = new byte[bilen];

fs.read(bi, 0, bilen);
nsize = constructInt(bf, 2);

nbisize = constructInt(bi, 2);

nwidth = constructInt(bi, 4);

nheight = constructInt(bi, 8);

nplanes = constructShort(bi, 12); //(((int)bi[13]&0xff)<<8) |

nbitcount = constructShort(bi, 14); //(((int)bi[15]&0xff)<<8) |

ncompression = constructInt(bi, 16);

nsizeimage = constructInt(bi, 20);

nxpm = constructInt(bi, 24);

nypm = constructInt(bi, 28);

nclrused = constructInt(bi, 32);

nclrimp = constructInt(bi, 36);

}

}

public static Image read(FileInputStream fs)

{

try {

BitmapHeader bh = new BitmapHeader();

bh.read(fs);

if (bh.nbitcount == 24)

return (readMap24(fs, bh));

if (bh.nbitcount == 32)

return (readMap32(fs, bh));

if (bh.nbitcount == 8)

return (readMap8(fs, bh));

fs.close();

} catch (IOException e) {

// System.out.println("Caught exception in loadbitmap!");
}

return (null);

}
protected static Image readMap32(FileInputStream fs, BitmapHeader bh)
throws IOException

{

Image image;

int xwidth = bh.nsizeimage / bh.nheight;

int ndata[] = new int[bh.nheight * bh.nwidth];

byte brgb[] = new byte[bh.nwidth * 4 * bh.nheight];

fs.read(brgb, 0, bh.nwidth * 4 * bh.nheight);

int nindex = 0;

for (int j = 0; j < bh.nheight; j++)

{

for (int i = 0; i < bh.nwidth; i++)

{

ndata[bh.nwidth * (bh.nheight - j - 1) + i] = constructInt3(
brgb, nindex);

nindex += 4;

}

}

image = Toolkit.getDefaultToolkit().createImage

(new MemoryImageSource(bh.nwidth, bh.nheight,

ndata, 0, bh.nwidth));

fs.close();

return (image);

}

protected static Image readMap24(FileInputStream fs, BitmapHeader bh)
throws IOException

{

Image image;

int npad = (bh.nsizeimage / bh.nheight) - bh.nwidth * 3;

int ndata[] = new int[bh.nheight * bh.nwidth];

byte brgb[] = new byte[(bh.nwidth + npad) * 3 * bh.nheight];

fs.read(brgb, 0, (bh.nwidth + npad) * 3 * bh.nheight);

int nindex = 0;

for (int j = 0; j < bh.nheight; j++)

{

for (int i = 0; i < bh.nwidth; i++)

{

ndata[bh.nwidth * (bh.nheight - j - 1) + i] = constructInt3(
brgb, nindex);

nindex += 3;

}

nindex += npad;

}

image = Toolkit.getDefaultToolkit().createImage

(new MemoryImageSource(bh.nwidth, bh.nheight,

ndata, 0, bh.nwidth));

fs.close();

return (image);

}

protected static Image readMap8(FileInputStream fs, BitmapHeader bh)
throws IOException

{

Image image;

int nNumColors = 0;

if (bh.nclrused > 0)

{

nNumColors = bh.nclrused;

}

else

{

nNumColors = (1 & 0xff) << bh.nbitcount;

}

if (bh.nsizeimage == 0)

{

bh.nsizeimage = ((((bh.nwidth * bh.nbitcount) + 31) & ~31) >> 3);

bh.nsizeimage *= bh.nheight;

// System.out.println("nsizeimage (backup) is"+nsizeimage);

}

// Read the palatte colors.

int npalette[] = new int[nNumColors];

byte bpalette[] = new byte[nNumColors * 4];

fs.read(bpalette, 0, nNumColors * 4);

int nindex8 = 0;

for (int n = 0; n < nNumColors; n++)

{

npalette[n] = constructInt3(bpalette, nindex8);

nindex8 += 4;

}

int npad8 = (bh.nsizeimage / bh.nheight) - bh.nwidth;

// System.out.println("nPad is:"+npad8);

int ndata8[] = new int[bh.nwidth * bh.nheight];

byte bdata[] = new byte[(bh.nwidth + npad8) * bh.nheight];

fs.read(bdata, 0, (bh.nwidth + npad8) * bh.nheight);

nindex8 = 0;

for (int j8 = 0; j8 < bh.nheight; j8++)

{

for (int i8 = 0; i8 < bh.nwidth; i8++)

{

ndata8[bh.nwidth * (bh.nheight - j8 - 1) + i8] =

npalette[((int) bdata[nindex8] & 0xff)];

nindex8++;

}

nindex8 += npad8;

}

image = Toolkit.getDefaultToolkit().createImage

(new MemoryImageSource(bh.nwidth, bh.nheight,

ndata8, 0, bh.nwidth));

return (image);

}

public static Image load(String sdir, String sfile) {

return (load(sdir + sfile));

}
public static Image load(String sdir)

{

try

{

FileInputStream fs = new FileInputStream(sdir);

return (read(fs));

}

catch (IOException ex) {

return (null);

}

}

public static void main(String[] args) throws IOException

{

if (args.length == 0) {

System.out.println("Usage >java BMPLoader ImageFile.bmp");

System.exit(0);

}

FileInputStream in = new FileInputStream(args[0]);

Image TheImage = read(in);

JFrame TheFrame = new JFrame(args[0]);

JLabel TheLabel = new JLabel(new ImageIcon(TheImage));

TheFrame.getContentPane().add(new JScrollPane(TheLabel));

TheFrame.setSize(300, 300);

TheFrame.setVisible(true);

}
}


----------------解决方案--------------------------------------------------------
如此的复杂.还不如先把它转成jpg或png
----------------解决方案--------------------------------------------------------
确实够复杂.
----------------解决方案--------------------------------------------------------

呵呵,对于C来说是很普通了,JAVA是简单,但最好还是看看比较地层的代码吧,不能光玩表面对象那。


----------------解决方案--------------------------------------------------------
C都能很轻松的显示BMP,JAVA肯定也没问题的,关键就看你了解不了解BMP的格式了
----------------解决方案--------------------------------------------------------
在Sun公司网站上,能不能下载支持BMP格式的扩展类库?

----------------解决方案--------------------------------------------------------
  相关解决方案