一、加载大图片进内存的处理
// 加载大的图片进内存,很容易出现内存溢出的现象,因为每个应用程序的VM Heap都很小16M/32M左右
// 因此经过处理后再加载进内存是比较合理的。
// 1,获取屏幕分辨率
WindowManager windowManager = getWindowManager();
int screenWidth = windowManager.getDefaultDisplay().getWidth();
int screenHeight = windowManager.getDefaultDisplay()
.getHeight();
// 2,获取图片分辨率
Options opts = new Options();
opts.inJustDecodeBounds = true; // 不加载进内存,但能获取图片的一些基本信息。
Bitmap bitmap = BitmapFactory.decodeFile(
Environment.getExternalStorageDirectory() + "/test.jpg",
opts);
int bitmapWidth = opts.outWidth;
int bitmapHeight = opts.outHeight;
// 3,计算压缩比率
int dx = bitmapWidth / screenWidth;
int dy = bitmapHeight / screenHeight;
int kbps = 1;
if (dx > dy && dy > 1) {
kbps = dx;
}
if (dy > dx && dx > 1) {
kbps = dy;
}
// 4,压缩图片并加载图片进内存
opts.inSampleSize = kbps;
opts.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeFile(
Environment.getExternalStorageDirectory() + "/test.jpg",
opts);
imageView.setImageBitmap(bitmap);
二、复制拷贝图片及修改图片大小
/**
* 复制图片及改变图片的大小
* @author Administrator
*
*/
public class MainActivity extends Activity {
private Button loadButton;
private ImageView srcImage, copyImage;
private Bitmap srcBitmap, copyBitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadButton = (Button) findViewById(R.id.loadButton);
srcImage = (ImageView) findViewById(R.id.srcImage);
copyImage = (ImageView) findViewById(R.id.copyImage);
//原图加载,图片不可修改
srcBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
srcImage.setImageBitmap(srcBitmap);
loadButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//copyBitmap = Bitmap.createBitmap(srcBitmap);这种方式拷贝图片也是不能修改的
//创建一个大小,属性和原图大小一样的Bitmap,但是是空的,这种方式拷贝的图片能修改。
copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),
srcBitmap.getHeight(), srcBitmap.getConfig());
//画布
Canvas canvas = new Canvas(copyBitmap);
//画笔
Paint paint = new Paint();
//设置图片的缩放比例,水平方向和竖直方向都变为一般
//如果要放大,那就要注意了,因为我们创建的空白的copyBitmap大小就和原图一样大,所以即使放大了,也只能显示放大的部分。
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
//复制原图
canvas.drawBitmap(srcBitmap, matrix, paint);
copyImage.setImageBitmap(copyBitmap);
}
});
}
}