如何从资源中加载位图而不改变大小?

18
使用这段代码:
    Drawable blankDrawable = context.getResources().getDrawable(image);
    Bitmap blankBitmap=((BitmapDrawable)blankDrawable).getBitmap();

我收到一个按上下文密度缩放的位图,保留位图的物理大小(基于其dpi值)。例如,我有一个405x500像素、dpi=96的位图资源。但是在设备上加载时,我得到了一个608x750像素、密度为240的图像。我想加载未经缩放的位图。如何做到这一点?
这个问题非常类似于: 如何从流创建Drawable而不调整大小? 但是,对于我的情况,该解决方案无法使用,因为我没有输入流。我只有一个资源ID,并且getDrawable()方法没有密度参数。一旦位图被加载,就太晚了——它已经被调整过大小了。
谢谢。
5个回答

30
使用这个。
InputStream is = this.getResources().openRawResource(imageId);
Bitmap originalBitmap = BitmapFactory.decodeStream(is);  
imageview.setImageBitmap(originalBitmap);

16

当你使用以下方法解码位图时:

BitmapFactory.decodeResource (Resources res, int id, BitmapFactory.Options opts) 

首先,在BitmapFactory.Options中将inScaled标志设置为false。

示例:

/* Set the options */
Options opts = new Options();
opts.inDither = true;
opts.inPreferredConfig = Bitmap.Config.RGB_565;
opts.inScaled = false; /* Flag for no scalling */ 


/* Load the bitmap with the options */
bitmapImage = BitmapFactory.decodeResource(context.getResources(),
                                           R.drawable.imageName, opts);

你能解释一下inDither吗?我已经阅读了文档,但还不太理解。 "@deprecated。如果dither为true,则解码器将尝试对解码后的图像进行抖动处理。" - CoderYel

7
另一个好的选择可能是将位图放在 drawable-nodpi 资源文件夹中。

3
在res目录下创建一个drawable文件夹(不含hdpi/mdpi等),将drawable放入该文件夹中,然后尝试使用。这可能会有所帮助。

8
这是另一种做法。创建一个新文件夹res/drawable-nodpi并将图像放在其中!这样它就不会被缩放,因此可以按原始大小(以像素为单位)加载: Drawable dh = Context.getResources().getDrawable(R.drawable.your_image_id); Bitmap bh = ((BitmapDrawable)dh).getBitmap(); - nagylzs

2
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ImageView image = (ImageView) findViewById(R.id.test_image);
    Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
    image.setImageBitmap(bMap);
}

首先创建一个包含布局中ImageView的ImageView实例。然后使用BitmapFactory.decodeResource()方法从应用程序图标(R.drawable.icon)创建位图。最后将新位图设置为布局中ImageView组件显示的图像。


1
可能会起作用。但是,我的应用程序直接使用数百个位图,并在内存中对它们进行绘制。实际上,该方法将上下文作为参数获取。它仅用于获取资源。否则,位图不会直接显示...因此,我更喜欢InputStream版本,因为它不使用任何GUI组件。 - nagylzs

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