我正在尝试将.jpg文件解码为位图并从位图文件中读取原始数据。 以下是我的应用程序的代码片段。
File file = new File(Environment.getExternalStorageDirectory(),"test.jpg");
int top = 450;
int left = 0;
int right= 1450;
int bottom = 2592;
int width = right-top;
int height = bottom-left;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options);
Bitmap bitmapScaled = Bitmap.createBitmap(bitmap, top, left, width, height);
bitmap.recycle();
ByteBuffer buffer = ByteBuffer.allocate(width*height*4);
bitmapScaled.copyPixelsToBuffer(buffer);
bitmapScaled.recycle();
File file2 = new File(Environment.getExternalStorageDirectory(),"decodeFile");
FileOutputStream out = new FileOutputStream(file2.getAbsolutePath());
out.write(buffer.array());
在上面的代码片段中,我试图将Bitmap文件中的原始数据读入ByteBuffers并存储到SDCARD中新创建的文件(decodeFile)中。
当我看到“decodeFile”中的数据时,一半数据将变为空,并且数据不正确。
以上是使用Bitmap类方法读取原始数据的一种方法。
当我使用下面的代码片段执行相同的操作时,即可获得正确的数据。
BitmapRegionDecoder bitmapRegionDecoder = BitmapRegionDecoder.newInstance(file1.getAbsolutePath(), true);
Bitmap bitmap1 = bitmapRegionDecoder.decodeRegion(new Rect(top,left,width,height),options);
ByteBuffer buffer = ByteBuffer.allocate(width*height*4);
bitmapScaled.copyPixelsToBuffer(buffer);
bitmapScaled.recycle();
File file2 = new File(Environment.getExternalStorageDirectory(),"regionFile");
FileOutputStream out = new FileOutputStream(file2.getAbsolutePath());
out.write(buffer.array());
如果我使用此代码段,我将获得正确的数据。但使用BitmapRegionDecoder的缺点是内存泄漏。应用程序每次都会丢失1.5 MB的内存,它会执行此API。此内存也无法通过GC返回应用程序。
所以任何人都可以帮我解决如何将位图中的数据复制到另一个文件而不会丢失数据的情况。如果有人对此做出反应,这将对我非常有帮助。
提前致谢