我遇到高分辨率图像问题。
我使用nodpi-drawable文件夹存储1280x720图像,并使用此代码进行缩放。
public static Drawable scaleDrawable(Drawable d, int width, Activity cxt)
{
BitmapDrawable bd = (BitmapDrawable)d;
double oldWidth = bd.getBitmap().getWidth();
double scaleFactor = width / oldWidth;
int newHeight = (int) (d.getIntrinsicHeight() * scaleFactor);
int newWidth = (int) (oldWidth * scaleFactor);
Drawable drawable = new BitmapDrawable(cxt.getResources(),MainScreen.getResizedBitmap(bd.getBitmap(),newHeight,newWidth));
BitmapDrawable bd2 = (BitmapDrawable)drawable;
return drawable;
}
public static Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
int width = bm.getWidth();
int height = bm.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// create a matrix for the manipulation
Matrix matrix = new Matrix();
// resize the bit map
matrix.postScale(scaleWidth, scaleHeight);
// recreate the new Bitmap
Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
return resizedBitmap;
}
我使用该代码将图像缩放到屏幕,所以如果屏幕是320x480,图像将缩放到320并保持比例,我不在乎图像是否从底部离开屏幕。
所有它的工作正常,但是在xhdpi设备中特别使用三星Galaxy Note 2,屏幕正好是720x1280。
它崩溃了行中的Out Of Memory Exception:
Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
我无法理解为什么,图像应该从720扩展到720但我的代码必须非常糟糕的优化或其他。
我没有尝试使用1080x1920设备,但它似乎也会崩溃。
在查看代码时,有人会看到一些不好的东西吗?
答案 0 :(得分:7)
使用此方法调整位图大小 -
Bitmap bm=decodeSampledBitmapFromPath(src, reqWidth, reqHeight);
使用此定义 -
public Bitmap decodeSampledBitmapFromPath(String path, int reqWidth,
int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap bmp = BitmapFactory.decodeFile(path, options);
return bmp;
}
}
public int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float) height / (float) reqHeight);
} else {
inSampleSize = Math.round((float) width / (float) reqWidth);
}
}
return inSampleSize;
}
如果您正在使用资源,那么将方法替换为BitmapFactory的decodeResource方法..
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
....
.....
return BitmapFactory.decodeResource(res, resId, options);
}
答案 1 :(得分:0)
您应该使用实用程序类BitmapFactory进行图像处理操作。还可以使用BitmapFactory.Options调整位图的输入/输出大小。在不再需要位图之后,您应该释放相关的内存。