Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息

1. 加载大图片到内存,从gallery获取图片

android默认的最大堆栈只有16M, 图片像素太高会导致内存不足的异常,

需要将图片等比例缩小到适合手机屏幕分辨率, 再加载。

从gallery 获取图片, 即要获取另一个activity的返回值。

示例代码:

Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息
public class MainActivity extends Activity {
    private ImageView iv;
    private WindowManager wm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        wm = getWindowManager();
        iv = (ImageView) findViewById(R.id.iv);
    }

    // 从系统的图库里面 获取一张照片
    public void click(View view) {
        Intent intent = new Intent();
        intent.setAction("android.intent.action.PICK");
        intent.addCategory("android.intent.category.DEFAULT");
        intent.setType("image/*");
        startActivityForResult(intent, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (data != null) {
            // 获取到系统图库返回回来图片的uri
            Uri uri = data.getData();
            System.out.println(uri.toString());
            
            try {
                InputStream is = getContentResolver().openInputStream(uri);
                // 1.计算出来屏幕的宽高.
                int windowWidth = wm.getDefaultDisplay().getWidth();
                int windowHeight = wm.getDefaultDisplay().getHeight();
                //2. 计算图片的宽高.
                // 2.计算出来图片的宽高.
                BitmapFactory.Options opts = new Options();
                // 设置 不去真正的解析位图 不把他加载到内存 只是获取这个图片的宽高信息
                opts.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(is, null, opts);
                int bitmapHeight = opts.outHeight;
                int bitmapWidth = opts.outWidth;

                if (bitmapHeight > windowHeight || bitmapWidth > windowWidth) {
                    int scaleX = bitmapWidth/windowWidth;
                    int scaleY = bitmapHeight/windowHeight;
                    if(scaleX>scaleY){//按照水平方向的比例缩放
                        opts.inSampleSize = scaleX;
                    }else{//按照竖直方向的比例缩放
                        opts.inSampleSize = scaleY;
                    }
                    
                }else{//如果图片比手机屏幕小 不去缩放了.
                    opts.inSampleSize = 1;
                }
                //让位图工厂真正的去解析图片
                opts.inJustDecodeBounds = false;
                //注意: 流的操作
                is = getContentResolver().openInputStream(uri);
                Bitmap bitmap = BitmapFactory.decodeStream(is, null, opts);
                iv.setImageBitmap(bitmap);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

}
Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息

2. 获取图片exif信息

示例代码:图片的所有描述信息都放在头部分,不仅可以读 还可以写入

Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息
public void click(View view) {
        try {
            ExifInterface exifInfo = new ExifInterface(
                    "/sdcard/DCIM/Camera/IMG_20121103_202628.jpg");
            String width = exifInfo.getAttribute(ExifInterface.TAG_IMAGE_WIDTH);
            String length = exifInfo
                    .getAttribute(ExifInterface.TAG_IMAGE_LENGTH);
            System.out.println(width);
            System.out.println(length);

            // 更改图片的exif 信息.
            // exifInfo.setAttribute(tag, value);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息

 

Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息,布布扣,bubuko.com

Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息

上一篇:pc telnet 登录 android 系统


下一篇:android之自定义ViewGroup和自动换行的布局的实现