将位图写入文件更改字节?

时间:2015-04-16 20:16:18

标签: android bitmap

我用字节数组制作了一个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 ...

1 个答案:

答案 0 :(得分:0)

不要使用Bitmap和BitmapFactory将字节数组保存到文件或在字节数组中加载文件。如您所见,这将改变字节。

最好直接将字节数组保存到文件中。并直接在字节数组中加载文件的内容。

也会更快。