Java(J2ME)将图像转换为byte [],然后返回图像
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java(J2ME)将图像转换为byte [],然后返回图像,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4001字,纯文字阅读大概需要6分钟。
内容图文
我正在尝试将Image对象转换为字节数组,然后再转换回Image(以便可以将图像存储在Apache Derby数据库的blob对象中).
我可以将Image转换为字节数组(下面的代码),但是不能将字节转换回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 << 8) >> 24 );
bytes[2] =(byte)( (integer << 16) >> 24 );
bytes[3] =(byte)( (integer << 24) >> 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 []缓冲区保存在记录存储中,然后使用它.
内容总结
以上是互联网集市为您收集整理的Java(J2ME)将图像转换为byte [],然后返回图像全部内容,希望文章能够帮你解决Java(J2ME)将图像转换为byte [],然后返回图像所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。