【问题标题】:Android Canvas How to scale Bitmap but keep original bound?Android Canvas 如何缩放位图但保持原始绑定?
【发布时间】:2015-02-12 12:35:17
【问题描述】:

我想使用 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);
    }

}

【问题讨论】:

    标签: android canvas bitmap scale


    【解决方案1】:

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

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

    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);
    

    然后简单地在画布上绘制缩放位图

    【讨论】:

    • 我试过了,但是位图只是缩放变模糊了,大小还是和之前的一样
    • 我看不到你在哪里使用矩阵
    • 你还得画位图
    • 可能你也不想画 src 而只画输出
    • 你的意思是“也画位图”?
    【解决方案2】:

    解决了

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-14
      • 1970-01-01
      • 2018-02-01
      • 1970-01-01
      • 2019-06-19
      • 2023-03-23
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      相关资源
      最近更新 更多