Android 位图平移/缩放/裁剪

Posted

技术标签:

【中文标题】Android 位图平移/缩放/裁剪【英文标题】:Android Bitmap Pan / Zoom / Crop 【发布时间】:2014-03-25 14:39:59 【问题描述】:

我需要一点帮助。我有一个带有触摸侦听器的 ImageView,我能够将所有触摸输入捕获到一个矩阵中,并将该矩阵应用于 ImageView 和瞧!图像可以适当地平移和缩放。

问题来了:我现在想裁剪图像,使其始终以相同的大小结束;例如 300x300 的图像。

换句话说,假设我的屏幕中间有一个 300x300 的正方形,用户平移和缩放图像,直到感兴趣的项目适合该正方形,然后点击“下一个”。我想要一张将照片裁剪为仅包含在框中的 300x300 部分的结果图像。

有道理吗??请帮忙!谢谢同志们!到目前为止,请参阅下面的一些代码。

float[] matrixVals = new float[9];
    ImageTouchListener.persistedMatrix.getValues(matrixVals);
    model.setCurrentBitmap(Bitmap.createBitmap(model.getOriginalBitmap(), 0, 0, model.getTargetWidth(), model.getTargetHeight(), ImageTouchListener.persistedMatrix, true));
    model.setCurrentBitmap(Bitmap.createBitmap(model.getCurrentBitmap(), Math.round(matrixVals[Matrix.MTRANS_X]), Math.round(matrixVals[Matrix.MTRANS_Y]), model.getTargetWidth(), model.getTargetHeight(), null, false));

最后,我还希望能够将图像缩小到盒子中,其中边缘实际上可能需要用黑色或白色或某种边框填充......到目前为止,我所做的一切除了当我点击下一个时,完全没有平移或缩放崩溃。

再次感谢!

【问题讨论】:

github.com/rombdn/img-touch-canvas 【参考方案1】:

看到这个自定义的ImageView,最重要的部分是onTouchEvent,其中裁剪的Bitmap被创建并保存到/sdcard进行验证:

class IV extends ImageView 
    Paint paint = new Paint();
    Rect crop = new Rect();

    public IV(Context context) 
        super(context);
        paint.setColor(0x660000ff);
    

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) 
        super.onSizeChanged(w, h, oldw, oldh);
        crop.set(w / 2, h / 2, w / 2, h / 2);
        crop.inset(-75, -75);
    

    @Override
    public void setImageResource(int resId) 
        super.setImageResource(resId);
        setScaleType(ScaleType.MATRIX);
        Matrix m = getImageMatrix();
        m.postScale(2, 2);
        m.postTranslate(40, 30);
    

    @Override
    public boolean onTouchEvent(MotionEvent event) 
        Bitmap croppedBitmap = Bitmap.createBitmap(crop.width(), crop.height(), Config.ARGB_8888);
        Canvas c = new Canvas(croppedBitmap);
        c.translate(-crop.left, -crop.top);
        c.concat(getImageMatrix());
        getDrawable().draw(c);

        // just save it for test verification
        try 
            OutputStream stream = new FileOutputStream("/sdcard/test.png");
            croppedBitmap.compress(CompressFormat.PNG, 100, stream);
         catch (FileNotFoundException e) 
            e.printStackTrace();
        

        return false;
    

    @Override
    protected void onDraw(Canvas canvas) 
        super.onDraw(canvas);
        canvas.drawRect(crop, paint);
    

【讨论】:

【参考方案2】:

我不太清楚你的问题是什么,是计算问题还是绘图问题……如果是绘图问题,我可能有解决方案……

创建一个新的位图,获取画布并将大图像的正确矩形绘制到新的小图像中......

    Bitmap bigPicture; //your big picture
    Bitmap bitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(bitmap);
    Rect source =  ...
    Rect dest = ...
    c.drawBitmap(bigPicture, source, dest, paint);

现在,如果您的问题是计算问题,我可能也有一个解决方案......

【讨论】:

以上是关于Android 位图平移/缩放/裁剪的主要内容,如果未能解决你的问题,请参考以下文章

壁纸应用程序的 Android 裁剪/缩放/平移库?类似于 Nova Launcher“设置壁纸”屏幕

保存 Android ImageView 位图

Android绘图使用 Graphics2D 实现动态效果

Android绘图使用 Graphics2D 实现动态效果

Android:从位图裁剪位图并设置为 ImageView src

如何在Android中从位图中裁剪圆形区域