Android图片缩放至屏幕密度

14

我有一个应用程序,其中嵌入了一个48x48像素、每英寸71.12像素密度的可绘制对象。 我通过流将相同的图像加载到Web服务器上,然后加载该流。

return new BitmapDrawable(getActivity().getResources(), new ByteArrayInputStream(imageThumbnail));

显示的结果为:

screenshot

我该如何使得BitmapDrawable的缩放与其他drawable相同?


你是指 BitmapDrawable.setDensity(71); 吗? - user999717
在Android 2.1中至少没有setDensity()方法,我尝试了bitmapDrawable.setTargetDensity(getActivity().getResources().getDisplayMetrics());但结果相同。 - user1035344
这是因为 targetDensity 已经设置为该值。还有,我的错。我想说的是 Bitmap.setDensity 但你也可以使用 Bitmap.createScaledBitmap() 进行缩放。 - user999717
3个回答

17

你可以触发Android BitmapFactory自动缩放位图,代码如下:

BitmapFactory.Options options = new BitmapFactory.Options();
DisplayMetrics metrics = context.getApplicationContext().getResources().getDisplayMetrics();
options.inScreenDensity = metrics.densityDpi;
options.inTargetDensity =  metrics.densityDpi;
options.inDensity = DisplayMetrics.DENSITY_DEFAULT;

Bitmap bm = BitmapFactory.decodeStream(in, null, options);
in.close();
BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), bm);

4
这个答案需要解释如何使用 inScreenDensityinTargetDensityinDensity - Raptor
在这个点上,通过以下三行代码解决了这个问题:options.inScreenDensity = metrics.densityDpi; options.inTargetDensity = metrics.densityDpi; options.inDensity = DisplayMetrics.DENSITY_DEFAULT; - The Goat

11

可以像这样执行:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

Bitmap bitmapOrg = new BitmapDrawable(getResources(), new  ByteArrayInputStream(imageThumbnail)).getBitmap();

int width = bitmapOrg.getWidth();
int height = bitmapOrg.getHeight();

float scaleWidth = metrics.scaledDensity;
float scaleHeight = metrics.scaledDensity;

// 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(bitmapOrg, 0, 0, width, height, matrix, true);

也许尝试不同的方法...在XML布局中以dips设置图像的高度和宽度,我猜您目前使用的是wrap_content高度和宽度的ImageView,请尝试将高度和宽度设置为48dip。


这导致大小增加,但仍小于从应用资源加载的大小:http://imgur.com/U6rLO - user1035344
是的,因此您应该以480x320屏幕的正确尺寸提供图像,然后手机将在分辨率为800x480的手机上进行1.5倍的缩放。 - SnowyTracks
基本上,网页上的图像需要更大...手机上的比例为:LDPI:0.6666,MDPI:1,HDPI:1.5。 - SnowyTracks
我会提供与我目前资源文件夹中相同的图像。这将是用户头像或图片的缩略图,我只需要48x48像素的缩略图,如果图像在大屏幕上有点拉伸也没关系,但我需要找到一种方法使它们与我拥有的其他48x48像素的图像完全相同大小。 - user1035344
2
也许尝试一种不同的方法...在XML布局中以dip设置图像的高度和宽度,我猜你现在的ImageView高度和宽度是wrap_content,尝试将高度和宽度设置为48dip。 - SnowyTracks

-2
获取屏幕的当前密度并将可绘制对象设置为该密度。
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int density  =  metrics.densityDpi
myDrawable.setDensity(densityDpi);

在哪里定义了densityDpi变量,在这个方法"myDrawable.setDensity(densityDpi);"中设置了它。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接