我用字节数组制作了一个Bitmap。我想将位图保存到文件中。然后,我想检索该位图并恢复原始字节数组。我以为我可以简单地保存文件然后读取它,但显然字节是不同的......
保存位图:
// create the bitmap
final Bitmap bitmap = Bitmap.createBitmap(width, newHeight, Bitmap.Config.ARGB_8888);
ByteBuffer buffer = ByteBuffer.wrap(originalBytes);
bitmap.copyPixelsFromBuffer(buffer);
...
// save the bitmap to file
String dir_path = Environment.getExternalStorageDirectory().getAbsolutePath();
File dir = new File(dir_path);
if(!dir.exists())
{
dir.mkdirs();
}
File file = new File(dir, "meh.png");
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
然后我读了这个文件
// read the file
String file_path = Environment.getExternalStorageDirectory().getAbsolutePath();
Bitmap bitmap = BitmapFactory.decodeFile(file_path + "/" + "meh.png");
// get the bytes
ByteBuffer buffer = ByteBuffer.allocate(bitmap.getByteCount());
bitmap.copyPixelsToBuffer(buffer);
byte[] retrievedBytes = buffer.array();
当我将originalBytes与retrieveBytes进行比较时,长度是相同的,但内容不是。我以为Bitmap.CompressFormat.PNG保证不压缩?我在这里缺少什么?
编辑:
以下是转换为十六进制的两个字节数组的部分
原始字节hex:8D7D A111 DE1D 105F 0B58 86A0 5F4D 035A D9A6 ......
检索字节十六进制:0406 0711 1F1D 105F 0B58 86A0 054D 035A 3C09 ...
答案 0 :(得分:0)
不要使用Bitmap和BitmapFactory将字节数组保存到文件或在字节数组中加载文件。如您所见,这将改变字节。
最好直接将字节数组保存到文件中。并直接在字节数组中加载文件的内容。
也会更快。