Android Canvas如何缩放Bitmap但保持原始绑定?

时间:2015-02-12 12:35:18

标签: android canvas bitmap scale

我想使用Canvas缩放位图

我需要保留Bitmap的原始宽度和高度

并且缩放的中心在绑定

中对齐

这是我尝试过的:

public Bitmap scale(Bitmap src) {
    int width = src.getWidth();
    int height = src.getHeight();
    float scaledWidth = width * .5f;
    float scaledHeight = height * .5f;

    Bitmap transBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(transBitmap);
    Paint paint = new Paint();
    float dx = (width - scaledWidth);
    float dy = (height - scaledHeight);
    canvas.drawBitmap(src, null, new RectF(dx, dy, scaledWidth, scaledHeight), paint);

    Matrix m = new Matrix();
    m.setRectToRect(new RectF(0, 0, src.getWidth(), src.getHeight()), new RectF(0, 0, scaledWidth, scaledHeight), Matrix.ScaleToFit.CENTER);
    Bitmap output = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), m, true);

    //return transBitmap;
    return output;
}

我在自定义ImageView onTouch中使用了这个方法:

 switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            setImageBitmap(scaledBmp);
            break;
        case MotionEvent.ACTION_UP:
            setImageDrawable(originalDrawable);
            break;
    }

更新

MyImageView.java

public class MyImageView extends ImageView {

    private Drawable mDrawable;
    private Drawable mScaled;

    public MyImageView(Context context, Drawable drawable) {
        super(context);
        setImageDrawable(drawable);
        Bitmap src = ((BitmapDrawable) drawable).getBitmap();
        mDrawable = drawable;
        mScaled = new BitmapDrawable(getResources(), makeScaled(src));
    }

    public Bitmap makeScaled(Bitmap src) {
        int width = src.getWidth();
        int height = src.getHeight();
        float scaledWidth = width * .95f;
        float scaledHeight = height * .95f;
        Matrix m = new Matrix();
        m.setRectToRect(new RectF(0, 0, src.getWidth(), src.getHeight()), new RectF(0, 0, scaledWidth, scaledHeight), Matrix.ScaleToFit.CENTER);
        Bitmap output = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), m, true);
        Canvas xfas = new Canvas(output);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setFilterBitmap(true);
        paint.setDither(true);
        xfas.drawBitmap(output, 0, 0, paint);

        return output;
    }

    @Override public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                setImageDrawable(mScaled);
                break;
            case MotionEvent.ACTION_UP:
                setImageDrawable(mDrawable);
                break;
        }
        return super.dispatchTouchEvent(event);
    }

}

2 个答案:

答案 0 :(得分:3)

如果我没有误解,一种解决方案是使用Matrix及其setRectToRect将原始值转换为所需的值。从文档

  

将矩阵设置为比例并转换映射源的值   矩形到目标矩形,如果是,则返回true   结果可以表示。

Matrix m = new Matrix();
m.setRectToRect(new RectF(0, 0, src.getWidth(), src.getHeight()), new RectF(0, 0, scaledWidth, scaledHeigth), Matrix.ScaleToFit.CENTER);
Bitmap output = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), m, true);

然后只需在画布上绘制缩放位图

答案 1 :(得分:0)

解决

public static Bitmap scaleBitmap(Bitmap src, float factor) {
    int width = src.getWidth();
    int height = src.getHeight();
    int scaledWidth = (int) (width * factor);
    int scaledHeight = (int) (height * factor);
    Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Bitmap scaled = Bitmap.createScaledBitmap(src, scaledWidth, scaledHeight, false);
    Canvas canvas = new Canvas(bmp);
    Paint paint = new Paint();
    int distX = (width - scaledWidth) / 2;
    int distY = (height - scaledHeight) / 2;
    canvas.drawBitmap(scaled, distX, distY, paint);
    return bmp;
}