简单的问题,简单的答案不起作用。我有一个位图,我希望在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()在缩放后返回驻留位图的维度,这意味着没有明显的方法来获取位图的原始宽度。
答案 0 :(得分:5)
Canvas类对drawBitmap()函数有很多重载。其中一个允许您通过非常舒适的界面缩放/剪切位图。
public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint
)
其中
现在就是一个例子!可以说,您希望将位图宽度缩小为 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
,你想要与原作比较,那么你可以使用它(以获得宽度和高度使用{ {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);
}