5

简单的问题,简单的答案不起作用。我有一个位图,我想通过系统在 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() 会在缩放后返回驻留位图的尺寸,这意味着没有明显的方法可以获取位图的原始宽度。

4

2 回答 2

5

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

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

在哪里

  • Bitmap bitmap - 是你要绘制的位图
  • Rect src - 位图中的源矩形。如果它不为空,它将从您的位图中切出一块(在 src 的大小和位置)
  • RectF dst - 此 Rect 将代表矩形,您的位图将适合。
  • 油漆油漆- 可选油漆

现在举个例子!比方说,您想将位图宽度缩小到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;

现在,如果您有另一个您的实际(缩放)Bitmap或一个ImageView,您想与原始比较,那么您可以使用它(使用getWidth()和获取宽度和高度getHeight()):

/*Get these values*/
int originalWidth, originalHeight, scaledWidth, scaledHeight; 

float scaleWidthRatio = (float)scaledWidth / originalWidth;
float scaleHeightRatio = (float)scaledHeight / originalHeight;
于 2012-08-29T22:59:54.997 回答
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);
}
于 2012-08-31T15:15:10.083 回答