【发布时间】:2014-05-03 10:46:40
【问题描述】:
我想缩放现有位图。所以我使用 Bitmap.createBitmap(Bitmap b, int x, int y, int width, int height, Matrix m, boolean filter) 创建一个缩放位图。如果 Matrix 对象的缩放比例小于 1,则此方法效果很好。但是,如果比率等于或大于 1,则该方法返回一个具有我想要的宽度和高度但没有图像(透明)的位图。我想知道为什么以及如何解决这个问题。
Bitmap imageBitmap;
imageBitmap = weiboView.getDrawingCache();
Log.d("cosmo", "bitmap generated: "+imageBitmap.getWidth()+" * "+imageBitmap.getHeight());
//Init and configure and load the image view
ImageView imageView = new ImageView(this);
imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
imageView.setScaleType(ScaleType.FIT_CENTER);
containerLayout.addView(imageView);
//create a scaled bitmap to assign to the image view
Bitmap scaledImageBitmap = MyBitmapUtils.getBitmapScaledToFitWidth(getWindowManager().getDefaultDisplay().getWidth(), imageBitmap);
Log.d("cosmo", "scaled: "+scaledImageBitmap.getWidth()+" * "+scaledImageBitmap.getHeight());
//Here if I set imageBitmap as the image of imageView it works well
imageView.setImageBitmap(scaledImageBitmap);
这里是 MyBitmapUtils.getBitmapScaledToFitWidth:
public static Bitmap getBitmapScaledToFitWidth(int targetWidth, Bitmap bitmap) {
float ratio = (float)targetWidth/(float)bitmap.getWidth();
Log.d("cosmo", "ratio is "+ratio);
//ratio = 0.5f;
Matrix matrix = new Matrix();
matrix.postScale(ratio, ratio);
Bitmap target = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,false);
return target;
}
我知道这是怎么发生的。因为Image的高度大于2048,在android系统中创建大于2048*2048的位图会导致OOM(我的logcat没有报这个错误,奇怪)
【问题讨论】:
-
为什么需要缩放位图?你想把它保存在 SD 卡上还是发送到某个地方?
-
只是想缩放它以适应具有指定宽度的图像视图
-
不,不,不,不要那样做,使用 scaleType="matrix" 并调用 setImageMatrix,或使用任何其他保留 scaleType 的纵横比