Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息
1. 加载大图片到内存,从gallery获取图片
android默认的最大堆栈只有16M, 图片像素太高会导致内存不足的异常,
需要将图片等比例缩小到适合手机屏幕分辨率, 再加载。
从gallery 获取图片, 即要获取另一个activity的返回值。
示例代码:
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); } }
2. 获取图片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(); } }