我有一个.net ASMX webservice,我正在使用ksoap2库消费。在服务中,我首先保存用户图像,然后检索它。但是,一旦我检索它,字节数组是完整的,但BitmapFactory无法解码它并返回null。
转换为字节数组:
Bitmap viewBitmap = Bitmap.createBitmap(imageView.getWidth(),
imageView.getHeight(), Bitmap.Config.ARGB_8888);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
viewBitmap.compress(CompressFormat.PNG, 0 /* ignored for PNG */, bos);
byte[] bitmapdata = bos.toByteArray();
webservice接受byte []格式的bytearray。
要将数组转换为位图:
byte[] blob= info.get(Main.KEY_THUMB_BYTES).getBytes();
Bitmap bmp=BitmapFactory.decodeByteArray(blob,0,blob.length); // Return null :(
imageView.setImageBitmap(bmp);
从部分分析看来,字节数组似乎没有变化。那为什么解码返回null?是否有更好的保存图像并通过Web服务传递它?我没有分析整个字节数组,所以我猜它可能会有所改变。
有什么想法?非常感谢!
更新 我只是尝试使用:
将byte []转换为字符串Base64.encodeToString( bos.toByteArray(), Base64.DEFAULT);
使用以下方法解码:
byte[] blob= Base64.decode(info.get(Main.KEY_THUMB_BYTES));
现在我得到的是一张白色图片。我不确定这里有什么问题。请帮忙。
更新 我将此图像存储在数据库中,位于 varchar(max)类型的列中。我应该将此字节数组字符串存储在不同的sql数据类型中吗?我对SQL没有太多的经验,所以我使用了varchar,因为它没有将文本转换为unicode,我认为这可能对你的字节数组有好处。
谢谢!
答案 0 :(得分:0)
将您的字节数组转换为Base64,这是一个字符串并且易于传输:
public static String bitmapToBase64(Bitmap bitmap) {
byte[] bitmapdata = bitmapToByteArray(bitmap);
return Base64.encodeBytes(bitmapdata);
}
public static byte[] bitmapToByteArray(Bitmap bitmap) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0 /* ignored for PNG */, bos);
byte[] bitmapdata = bos.toByteArray();
return bitmapdata;
}
和
public static Bitmap base64ToBitmap(String strBase64) throws IOException {
byte[] bitmapdata = Base64.decode(strBase64);
Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapdata, 0,
bitmapdata.length);
return bitmap;
}
您不仅可以在图像文件上执行此操作,还可以在每种文件类型上执行此操作:
public static String fileToBase64(String path) throws IOException {
byte[] bytes = fileToByteArray(path);
return Base64.encodeBytes(bytes);
}
public static byte[] fileToByteArray(String path) throws IOException {
File imagefile = new File(path);
byte[] data = new byte[(int) imagefile.length()];
FileInputStream fis = new FileInputStream(imagefile);
fis.read(data);
fis.close();
return data;
}
public static void base64ToFile(String path, String strBase64)
throws IOException {
byte[] bytes = Base64.decode(strBase64);
byteArrayTofile(path, bytes);
}
public static void byteArrayTofile(String path, byte[] bytes)
throws IOException {
File imagefile = new File(path);
File dir = new File(imagefile.getParent());
if (!dir.exists()) {
dir.mkdirs();
}
FileOutputStream fos = new FileOutputStream(imagefile);
fos.write(bytes);
fos.close();
}