Android位图平移/缩放/裁剪

Android位图平移/缩放/裁剪,android,image,bitmap,Android,Image,Bitmap,我需要一些帮助。我有一个带有触摸监听器的ImageView,我能够将所有触摸输入捕获到一个矩阵中,并将该矩阵应用到ImageView,瞧!图像会适当地平移和缩放 问题是:我现在想裁剪图像,使其始终保持相同的大小;例如一张300x300的图片 换句话说,假设我在屏幕中间有一个300×300平方,一个用户对图像进行缩放和缩放,直到一个感兴趣的东西适合这个方块,然后点击“下一步”。我想有一个结果图像,已裁剪的照片,只有300x300部分,是包含在框中 有意义吗??请帮忙!谢谢同志们!请参阅下面的一些代

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

问题是:我现在想裁剪图像,使其始终保持相同的大小;例如一张300x300的图片

换句话说,假设我在屏幕中间有一个300×300平方,一个用户对图像进行缩放和缩放,直到一个感兴趣的东西适合这个方块,然后点击“下一步”。我想有一个结果图像,已裁剪的照片,只有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));
最后,我还希望能够将图像缩小到框中,框中的边缘实际上可能需要填充黑色或白色或某种边框。。。到目前为止,当我点击下一个按钮时,除了没有平移或缩放之外,我所做的一切都崩溃了


再次感谢

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

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

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

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

查看此自定义图像视图,最重要的部分是onTouchEvent,其中创建了裁剪的位图并将其保存到/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);
    }
}