这是一个场景: 在Android操作系统中加载图片 - >将其转换为字节数组 - >将其发送到基于SWT的应用程序 - >将它加载到组件中(我不知道,标签,按钮......)。
我正确接收字节数组,但我无法对其进行解析以转换为图像。
这是我在网上找到的唯一代码,有效:
byte[] bs = { (byte) 0x11, (byte) 0x11, (byte) 0x11, (byte) 0x00, (byte) 0x00,
(byte) 0x11, (byte) 0x11, (byte) 0x11, (byte) 0x11, (byte) 0x10, (byte) 0x00, (byte) 0x01,
(byte) 0x10, (byte) 0x00, (byte) 0x01, (byte) 0x11, (byte) 0x11, (byte) 0x00, (byte) 0x22,
(byte) 0x01, (byte) 0x10, (byte) 0x33, (byte) 0x00, (byte) 0x11, (byte) 0x10, (byte) 0x02,
(byte) 0x22, (byte) 0x01, (byte) 0x10, (byte) 0x33, (byte) 0x30, (byte) 0x01, (byte) 0x10,
(byte) 0x22, (byte) 0x22, (byte) 0x01, (byte) 0x10, (byte) 0x33, (byte) 0x33, (byte) 0x01,
(byte) 0x10, (byte) 0x22, (byte) 0x22, (byte) 0x01, (byte) 0x10, (byte) 0x33, (byte) 0x33,
(byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x11, (byte) 0x11, (byte) 0x01, (byte) 0x10,
(byte) 0x11, (byte) 0x11, (byte) 0x10, (byte) 0x01, (byte) 0x11, (byte) 0x11, (byte) 0x01,
(byte) 0x10, (byte) 0x11, (byte) 0x11, (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0x44,
(byte) 0x44, (byte) 0x01, (byte) 0x10, (byte) 0x55, (byte) 0x55, (byte) 0x01, (byte) 0x10,
(byte) 0x44, (byte) 0x44, (byte) 0x01, (byte) 0x10, (byte) 0x55, (byte) 0x55, (byte) 0x01,
(byte) 0x10, (byte) 0x04, (byte) 0x44, (byte) 0x01, (byte) 0x10, (byte) 0x55, (byte) 0x50,
(byte) 0x01, (byte) 0x11, (byte) 0x00, (byte) 0x44, (byte) 0x01, (byte) 0x10, (byte) 0x55,
(byte) 0x00, (byte) 0x11, (byte) 0x11, (byte) 0x10, (byte) 0x00, (byte) 0x01, (byte) 0x10,
(byte) 0x00, (byte) 0x01, (byte) 0x11, (byte) 0x11, (byte) 0x11, (byte) 0x11, (byte) 0x00,
(byte) 0x00, (byte) 0x11, (byte) 0x11, (byte) 0x11, };*/
Color white = display.getSystemColor(SWT.COLOR_WHITE);
Color black = display.getSystemColor(SWT.COLOR_BLACK);
Color yellow = display.getSystemColor(SWT.COLOR_YELLOW);
Color red = display.getSystemColor(SWT.COLOR_RED);
Color green = display.getSystemColor(SWT.COLOR_GREEN);
Color blue = display.getSystemColor(SWT.COLOR_BLUE);
// Create a source ImageData of depth 4
PaletteData palette = new PaletteData(new RGB[] { black.getRGB(), white.getRGB(),
yellow.getRGB(), red.getRGB(), blue.getRGB(), green.getRGB() });
ImageData sourceData = new ImageData(16, 16, 4, palette, 1, b);
但是当我更改字节数组时不起作用。在这种情况下如何设置PaletteData和ImageData?
答案 0 :(得分:0)
我认为您应该可以使用ImageIO.read
来解析图像:
InputStream in = new ByteArrayInputStream(imageDataByteArray);
BufferedImage bufImg = ImageIO.read(in);
ImageIcon icon = new ImageIcon(bufImg);
myButton.setIcon(icon);
由于BufferedImage
是java.awt.Image
的子类,您应该可以按原样使用它。我自己没有测试过,但我不明白为什么它不起作用。
另请注意,您无法随机更改字节数组并期望它代表有效图像。如果您提供的数组不包含有效的图像数据(或包含不受支持的格式的图像),则ImageIO.read
将返回null
。有关详细信息,请查看ImageIO.read
documentation。
答案 1 :(得分:0)
好的,这是正确的方式:
contact.setImage(pCur.getBlob(0));
publishProgress("befor compress");
Bitmap image = BitmapFactory.decodeByteArray(contact.getImage(), 0, contact.getImage().length);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 50, stream); //JPEG or what you want
contact.setImage(stream.toByteArray());
stream.close();
无论如何我无法发送格式正确的字节数组。我发送~1700字节的字节数组,并接收一个包含~2800个元素的数组。我不知道为什么。我用UTF-8字符串编码。但是文件中的打印数组在本地工作。
答案 2 :(得分:0)
****It's work for me****
String filepath = "/sdcard/Image/Image01.jpg";
File imagefile = new File(filepath);
FileInputStream fis = null;
try
{
fis = new FileInputStream(imagefile);
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
Bitmap bm = BitmapFactory.decodeStream(fis);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100 , baos);
byte[] b = baos.toByteArray();
System.out.println(baos);
Bitmap bm1=BitmapFactory.decodeByteArray(b,0, b.length);
imgViewBitmap.setImageBitmap(bm1);