Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是有效处理大型图像的正确方法吗(以避免Android中的OutOfMemoryError)_Android_Out Of Memory_Bitmapfactory_Android Bitmap - Fatal编程技术网

这是有效处理大型图像的正确方法吗(以避免Android中的OutOfMemoryError)

这是有效处理大型图像的正确方法吗(以避免Android中的OutOfMemoryError),android,out-of-memory,bitmapfactory,android-bitmap,Android,Out Of Memory,Bitmapfactory,Android Bitmap,感谢所有Android爱好者的努力,我找到了一种在Android应用程序中高效处理大型图像的方法,以消除outOfMemory错误。但我真的需要知道这是正确的正式方法。还是我需要添加一些内容或进行任何更改。请评论 Bitmap bitmap1; iv1 = (ImageView) findViewById(R.id.iv1); iv2 = (ImageView) findViewById(R.id.iv2); iv3 = (ImageView) findViewById(R.id.iv3);

感谢所有Android爱好者的努力,我找到了一种在Android应用程序中高效处理大型图像的方法,以消除outOfMemory错误。但我真的需要知道这是正确的正式方法。还是我需要添加一些内容或进行任何更改。请评论

Bitmap bitmap1;

iv1 = (ImageView) findViewById(R.id.iv1);
iv2 = (ImageView) findViewById(R.id.iv2);
iv3 = (ImageView) findViewById(R.id.iv3);

BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;

BitmapFactory.decodeResource(getResources(), R.drawable.image1);
BitmapFactory.decodeResource(getResources(), R.drawable.image2);
BitmapFactory.decodeResource(getResources(), R.drawable.image3);

int srcWidth = o.outWidth;
int srcHeight = o.outHeight;
int dstWidth = 600;        
 int dstHeight = 450;
int inSampleSize = 1;               
if (srcHeight > dstHeight || srcWidth > dstWidth) {
            final int halfHeight = srcHeight / 2;
            final int halfWidth = srcWidth / 2;
            while ((halfHeight / inSampleSize) > dstWidth
                    && (halfWidth / inSampleSize) > dstWidth) {
                inSampleSize *= 2;
            }
        }        
        o.inSampleSize = inSampleSize;
        o.inJustDecodeBounds = false;
        bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.image1, o);
        iv1.setImageBitmap(bitmap1);


        bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.image2, o);
        iv2.setImageBitmap(bitmap1);
        Toast.makeText(getApplicationContext(),
                "DEcoded", Toast.LENGTH_LONG).show();

        bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.image3, o);
        iv3.setImageBitmap(bitmap1);



    @Override
    protected void onDestroy() {
        bitmap1.recycle();
        super.onDestroy();
        Toast.makeText(getApplicationContext(),
                "Bitmap Destroyed", Toast.LENGTH_LONG).show();
    }

似乎您的代码正在做与相同的事情

这个想法是,如果我们试图在300*300的视图区域中显示位图,我们不需要将相当大的资源(比如1000*1000位图资源)加载到内存中。只需先获取纵横比,然后将其解码为相对较小的位图,以节省内存(并避免OOM)


所以我认为这应该足够了。

试试这里……但首先想到的是,如果这些行正在执行
BitmapFactory.decodeResource(getResources(),R.drawable.image1到2);
您知道in
o.outWidth
仅是上一幅图像的宽度(image3)我不明白你的意思。请你进一步解释一下。谢谢。谢谢你的回答。