在一次使用相机获取图片并保存图片的过程中,byte[] 转图片/图片文件一直不成功,也不报错,折磨了我好一会,不明白为什么这样。后来借鉴网上的思路,对byte[] 进行转码处理,然后再转为图片/图片文件。自己试了一下,确实可以解决问题,虽然原因还是不明确,但也记录一下,以供以后学习参考。
byte[]转为图片文件时的原代码:
private void bytesToImageFile(byte[] data, String path) {
try {
File file = new File(path);
if(file.exists()){
file.delete();
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(data, 0, data.length);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
此段代码运行后能创建图片文件,但图片文件为损坏的文件,无法使用。
byte[]转为Bitmap时的原代码:
private static Bitmap byteToBitmap(byte[] data){
return BitmapFactory.decodeByteArray(data, 0, data.length);
}
此段代码运行后返回null。
转码处理,方法如下:
/**
* 转码处理
* @param data
* @param width 图片宽度
* @param height 图片高度
* @return
*/
private static byte[] transcodeProcess(byte[] data, int width, int height){
YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21, width, height, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, width, height), 80, baos);
byte[] jdata = baos.toByteArray();
return jdata;
}
在上面byte转图片文件和Bitmap的过程中,加入转码处理,即可达到预期目的。
byte转图片文件:
private void bytesToImageFile(byte[] data, String path) {
try {
File file = new File(path);
if(file.exists()){
file.delete();
file.createNewFile();
}
// 转码处理
byte[] jdata = transcodeProcess(data, 100, 100);
FileOutputStream fos = new FileOutputStream(file);
fos.write(data, 0, data.length);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
byte转Bitmap:
private static Bitmap byteToBitmap(byte[] data){
// 转码处理
byte[] jdata = transcodeProcess(data, 100, 100);
return BitmapFactory.decodeByteArray(jdata , 0, jdata.length);
}