Android:如何在onDraw()中获取位图的缩放宽度

时间:2012-08-29 22:16:08

标签: android bitmap scale

简单的问题,简单的答案不起作用。我有一个位图,我希望在onDraw()方法中为系统显示不同DPI屏幕的尺寸。 bitmap.width()成功返回其未缩放的宽度。但是,bitmap.getScaledWidth()返回零。我尝试过getScaledWidth(canvas)和getScaledWidth(canvas.getDensity()),但都返回0.确实,canvas.getDensity()返回零,所以我甚至无法手动计算它。

我做错了什么?

更详细一点。我正在使用自定义视图。位图在类中声明并在构造函数中加载。

编辑:

我发现使用:

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

bitmap.getScaledHeight(metrics)返回与bitmap.getHeight()相同的值。

看起来bitmap.getWidth()在缩放后返回驻留位图的维度,这意味着没有明显的方法来获取位图的原始宽度。

2 个答案:

答案 0 :(得分:5)

Canvas类对drawBitmap()函数有很多重载。其中一个允许您通过非常舒适的界面缩放/剪切位图。

public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)

其中

  • 位图位图 - 是您想要绘制的位图
  • Rect src - 来自位图的源矩形。如果它不为null,它会 从你的位图中切出一块(在src的大小和位置)
  • RectF dst - 此Rect将表示您的Bitmap将使用的Rectangle 适合。
  • 油漆颜料 - 可选油漆

现在就是一个例子!可以说,您希望将位图宽度缩小为 1/2 ,并将高度增加到原来的 2 次:

float startX = 0; //the left
float startY = 0; //and top corner (place it wherever you want)
float endX = startX + bitmap.getWidth() * 0.5f; //right
float endY = startY + bitmap.getHeight() * 2.0f; //and bottom corner

canvas.drawBitmap(bitmap, null, new RectF(startX, startY, endX, endY), null);

<强>更新

在阅读你的评论之后,我真的不明白,你想要完成什么,但这里有一些额外的信息可以开始:

获取Bitmap的原始大小而不将其加载到内存中:

BitmapFactory.Options options = new BitmapFactory.Options();
bitmapOptions.inJustDecodeBounds = true; // bitmap wont be loaded into the memory

//won't load the Bitmap, but the options will contain the required information.
BitmapFactory.decodeStream(inputStream, null, options);
/*or*/ BitmapFactory.decodeFile(pathName, options);

int originalWidth = bitmapOptions.outWidth;
int originalHeight = bitmapOptions.outHeight;

现在,如果你有另一个你的实际(缩放)BitmapImageView,你想要与原作比较,那么你可以使用它(以获得宽度和高度使用{ {1}}和getWidth()):

getHeight()

答案 1 :(得分:1)

这个怎么样?您自己缩放位图。 : - )

protected void onDraw(Canvas canvas) {
        //super.onDraw(canvas);
        Drawable drawable = getDrawable();
        if(drawable==null)
            Log.d("onDraw()","getDrawable returns null");

        Bitmap  fullSizeBitmap,scaledBitmap = null,roundBitmap = null;

        fullSizeBitmap = ((BitmapDrawable)drawable).getBitmap() ;

        //get width & height of ImageView
        int scaledWidth = getMeasuredWidth();
        int scaledHeight = getMeasuredHeight();

        //bitmap, which will receive the reference to a bitmap scaled to the bounds of the ImageView.
        if(fullSizeBitmap!=null)
        scaledBitmap= getScaledBitmap(fullSizeBitmap,scaledWidth,scaledHeight);

        //Now, draw the bitmap on the canvas
        if(roundBitmap!=null)
           canvas.drawBitmap(roundBitmap, 0,0 , null);
}