Java(J2ME)将Image转换为byte ,然后返回Image

我正在尝试将Image对象转换为字节数组,然后再转换为Image(以便我可以将图像存储在Apache Derby数据库中的blob对象中)。

我可以将Image转换为字节数组(下面的代码),但我无法将字节转换回图像。 作为一个更复杂的我正在使用J2ME,所以我不能使用javax.image。*。 你能帮我吗?

谢谢

package six.util; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; import java.awt.Component; import java.awt.MediaTracker; import java.awt.Graphics; import java.awt.image.DataBufferByte; import java.awt.image.WritableRaster; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.image.PixelGrabber; import java.util.ArrayList; public class ImageConverter extends Component { private MediaTracker mediaTracker; private Image image; private ImageConverter(Image image) { super(); this.mediaTracker = new MediaTracker(this); this.mediaTracker.addImage(image, 0); this.image = image; } private BufferedImage convert() { /* * Have to wait for image to load. */ try { this.mediaTracker.waitForID(0); }catch(InterruptedException e) { } System.out.println("-1"); GraphicsConfiguration graphicsConfig = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); BufferedImage bimage = graphicsConfig.createCompatibleImage(this.image.getWidth(null),this.image.getHeight(null)); System.out.println("-2"); Graphics g = bimage.getGraphics(); g.drawImage(image, 0, 0, null); return bimage; } private static byte[] convertIntToByteArray(int integer) { byte[] bytes = new byte[4]; bytes[0] =(byte)( integer >> 24 ); bytes[1] =(byte)( (integer <> 24 ); bytes[2] =(byte)( (integer <> 24 ); bytes[3] =(byte)( (integer <> 24 ); return bytes; } private static int convertByteArrayToInt(byte[] bytes) { return (bytes[0] << 32) | (bytes[1] << 24) | (bytes[2] << 16) | (bytes[3] << 8) | bytes[4]; } private static byte[] convertIntArrayToByteArray(int[] integers) { byte[] bytes = new byte[integers.length*4]; for (int index = 0; index < integers.length; index++) { byte[] integerBytes = convertIntToByteArray(integers[index]); bytes[index*4] = integerBytes[0]; bytes[1 + (index*4)] = integerBytes[1]; bytes[2 + (index*4)] = integerBytes[2]; bytes[3 + (index*4)] = integerBytes[3]; } return bytes; } private static int[] convertByteArrayToIntArray(byte[] bytes) { ArrayList integers = new ArrayList(); for (int index = 0; index < bytes.length; index += 4) { byte[] fourBytes = new byte[4]; fourBytes[0] = bytes[index]; fourBytes[1] = bytes[index+1]; fourBytes[2] = bytes[index+2]; fourBytes[3] = bytes[index+3]; int integer = convertByteArrayToInt(fourBytes); integers.add(new Integer(integer)); } int[] ints = new int[bytes.length/4]; for (int index = 0; index < integers.size() ; index++) { ints[index] = ((Integer)integers.get(index)).intValue(); } return ints; } public static byte[] convertToBytes(Image image) { System.out.println("A"); ImageConverter converter = new ImageConverter(image); System.out.println("B"); BufferedImage bufferedImage = converter.convert(); System.out.println("C"); PixelGrabber pixelGrabber = new PixelGrabber(image,0,0,bufferedImage.getWidth(),bufferedImage.getHeight(),true); System.out.println("D"); try { if(pixelGrabber.grabPixels()) { Object pixels = pixelGrabber.getPixels(); if (pixels instanceof byte[]) { return (byte[])pixels; } return convertIntArrayToByteArray((int[])pixels); } }catch(InterruptedException e) { } return null; } } 

要重新创建映像,可以使用Image类( http://java.sun.com/javame/reference/apis/jsr118/ )中的方法createRGBImage,但请注意,对于每个像素,您使用的是4个字节。图片。 宽度为200 x 200像素的图像总共将有40000像素,这将占用移动设备中160KB的内存。

我以前在J2ME中使用过图像,但只是将图像从服务器发送到客户端。 在这种情况下,您可以更改服务器上的图像分辨率(您有代码和原始功率),将其编码为JPEG,然后将其发送到客户端。 Image.createImage(…)方法可以创建运行应用程序的J2ME引擎支持的任何编码格式的图像。 我相信JPEG将永远被接受。

即使您需要这些图像以供将来使用,您也可以将服务器返回的byte []缓冲区保存在Record Store中,然后使用它。

我不知道javame,但这不会有用吗?

 javax.microedition.lcdui.Image.createImage(new ByteArrayInputStream(byte[]))