【问题标题】:How to load bitmap from res without resizing?如何在不调整大小的情况下从 res 加载位图?
【发布时间】:2011-11-28 23:19:24
【问题描述】:

使用此代码:

    Drawable blankDrawable = context.getResources().getDrawable(image);
    Bitmap blankBitmap=((BitmapDrawable)blankDrawable).getBitmap();

我得到一个按上下文密度缩放的位图,保留位图的物理大小(基于其 dpi 值)。例如,我有一个 405x500 位图 (dpi=96) 作为资源。但是当我将它加载到设备上时,我得到了一个密度为 240 的 608x750 图像。我想在不缩放的情况下加载位图。我该怎么做?

这个问题非常类似于:

How to create a Drawable from a stream without resizing it?

但是,在我的情况下不能使用该解决方案,因为我没有输入流。我只有一个资源 id,getDrawable() 方法没有密度参数。加载位图后,为时已晚 - 它已经调整大小。

谢谢。

【问题讨论】:

    标签: android bitmap


    【解决方案1】:

    使用这个

    InputStream is = this.getResources().openRawResource(imageId);
    Bitmap originalBitmap = BitmapFactory.decodeStream(is);  
    imageview.setImageBitmap(originalBitmap);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        当你用

        解码位图时
        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);
        

        【讨论】:

        • 你能解释一下Dither吗?我已阅读文档,但不太了解它。 "@deprecated。如果抖动为真,解码器将尝试抖动解码后的图像。"
        【解决方案4】:
        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组件中显示的图像。

        【讨论】:

        • 它可能会起作用。但是,我的应用程序直接使用数百个位图,并在内存中使用它们。实际上,该方法获取上下文作为参数。它仅用于获取资源。否则不直接显示位图...所以我更喜欢 InputStream 版本,因为它不使用任何 GUI 组件。
        【解决方案5】:

        在 res 中创建一个可绘制(没有 hdpi/mdpi 等)文件夹。将drawable保存在该文件夹中。现在试试看。这可能会对您有所帮助。

        【讨论】:

        • 这是另一种方法。创建新文件夹 res/drawable-nodpi 并将您的图像放在那里!它不会被缩放,因此它将以原始大小(以像素为单位)加载它: Drawable dh = Context.getResources().getDrawable(R.drawable.your_image_id);位图 bh =((BitmapDrawable)dh).getBitmap();
        猜你喜欢
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多