当前位置: 代码迷 >> Android >> pro.Android Media-处置大的图片
  详细解决方案

pro.Android Media-处置大的图片

热度:79   发布时间:2016-05-01 14:07:55.0
pro.Android Media--处理大的图片

调用照相机程序,可以在intent中加入android.provider.MediaStore.EXTRA_OUTPUT参数来设置图片保存位置。如下:

?

String imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()		+"/myfavoritepicture.jpg";File imageFile = new File(imageFilePath);Uri imageFileUri = Uri.fromFile(imageFile);		//		Uri imageFileUri = Uri.parse("file:///sdcard/myfavoritepicture.jpg");		Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);startActivityForResult(i, CAMERA_RESULT);
?

对于大的图片,android加载的时候很有可能出现OOM(out of memory)。这个时候我们需要对图片进行处理。

?

图片加载到内存所占空间

------------------------------------------------------- ?

 一张分辨率为1024×768,32位色彩的图像,其文件大小约为?

  

  一、基础知识的掌握

  首先我们必须明白,图片的每个像素所占的位数。

  每个像素的位数,大体有如下几类。

  1位,(单色);4位:(16色);8位(256色);

  16(64K色,高彩色);24(16M色,真彩色);32(4096M色,增强型真彩色)。

  然后,你得明白,在计算机中的最小的存储容量单位为Bit,即位的意思。

  二、计算方法

  ①首先计算出该图片的大小为多少个Bit

  拿例题一来计算,就等于:

  A、像素总数为:1024x768=786432个像素

  B、每个像素占32个Bit。

  所以,该图片所占的总的Bit大小为:

  1024x768x32=25165824Bit

  ②计算图片所占的磁盘存储空间

  这就需要您对磁盘存储空间单位的换算有一定的掌握。使用总的Bit数转换成为相应的KB、MB、GB等,就可以计算出结果了。

  1Byte=8bit 1Kb=1024B 1Mb=1024KB

  好了,有了如上的基础,我们就可以计算出该图片的所占的存储空间的大小了。

  1024x768x32 现在单位为Bit

  1024x768x32÷8 现在单位为Byte

  1024x768x32÷8÷1024=3072KB 现在单位为KB

????? 1024x768x32÷8÷1024÷1024=3MB 现在单位为MB

-------------------------------------------------------

这里可以看出图片加载到内存是很大的,所以我们要对图片进行处理

?

?

BitmapFactory.Options可以让我们控制如何将bitmap读入内存中

inSampleSize可以让我们缩放图片

inJustDecodeBounds设置为true,可以让我们不用解析图片就可以得到图片大小。返回的图片对象是null。我们可以得到图片的信息,但是不用为图片分配内存

?

public class SizedCameraIntent extends Activity {	final static int CAMERA_RESULT = 0;		ImageView mImagevView;	String imageFilePath;		@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);				setContentView(R.layout.ch1);				imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()		+"/myfavoritepicture.jpg";		File imageFile = new File(imageFilePath);		Uri imageFileUri = Uri.fromFile(imageFile);		//		Uri imageFileUri = Uri.parse("file:///sdcard/myfavoritepicture.jpg");				Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);		i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);		startActivityForResult(i, CAMERA_RESULT);	}		@Override	protected void onActivityResult(int requestCode, int resultCode, Intent data) {		super.onActivityResult(requestCode, resultCode, data);				if(resultCode == RESULT_OK){			mImagevView = (ImageView)findViewById(R.id.returnedImageView);						Display currentDisplay = getWindowManager().getDefaultDisplay();			int dw = currentDisplay.getWidth();			int dh = currentDisplay.getHeight();						//得到图片大小但是不加载图片			BitmapFactory.Options options = new BitmapFactory.Options();			options.inJustDecodeBounds = true;			Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, options);						int heightRatio = (int)Math.ceil(options.outHeight/(float)dh);			int widthRatio = (int)Math.ceil(options.outWidth/(float)dw);						if(heightRatio > 1 && widthRatio > 1){				if(heightRatio > widthRatio){					options.inSampleSize = heightRatio;				}else{					options.inSampleSize = widthRatio;				}			}						//解析图片			options.inJustDecodeBounds = false;			bmp = BitmapFactory.decodeFile(imageFilePath, options);						mImagevView.setImageBitmap(bmp);					}	}}
  相关解决方案