Android 从相机获取位图,缩放 canvas 到位图大小并保存位图

Android get bitmap from camera, scale canvas to bitmap size and save bitmap

我让用户选择图像分辨率,例如 4096x3024px,然后从流中获取可变位图,然后将其发送到 surfaceview 并创建另一个 canvas,用于从屏幕尺寸缩放到位图尺寸。

当我缩放此 canvas 放大图像时,图像未正确放大。我尝试创建一个从中心枢轴放大的矩阵,但仍然没有结果。

这是我从相机预览中获取位图并绘制到 canvas 用于缩放和保存的地方

    public Bitmap mergeImageAndCanvas(Bitmap bitmap) {

    // DRAW TO Canvas created in constructor
    canvasImage.setBitmap(bitmap);
    render(canvasImage, true);
    canvasImage.setBitmap(null);
    System.out.println("Canvas " + canvas.getWidth() + ", height " + canvas.getHeight());

    return bitmap;
}

这里我放大并尝试居中图像以保持我绘制的文本和线条的准确位置

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    // Toast.makeText(getContext(), "Surfaceview surfaceChanged() width " +
    // width + ", height" + height,
    // Toast.LENGTH_LONG).show();
    bitmapWitdh = photoHandler.photoWidth;
    bitmapHeight = photoHandler.photoHeight;
    canvasWidth = width;
    ratioX = (float) canvasWidth / 1280;
    canvasHeight = height;
    scaleX = ((float) bitmapWitdh) / (float) canvasWidth;
    scaleY = ((float) bitmapHeight) / (float) canvasHeight;
    float middleX = bitmapWitdh / 2.0f;
    float middleY = bitmapHeight / 2.0f;
    scaleMatrix = new Matrix();
    // scaleMatrix.preScale(scaleX, scaleY);
    scaleMatrix.setScale(scaleX, scaleY, middleX, middleY);
    // scaleMatrix.postTranslate(-(bitmapWitdh) / 2, -(bitmapHeight) / 2);
    // scaleMatrix.setTranslate(300, 300);
    canvasImage.setMatrix(scaleMatrix);
}

这是我希望在升级后实现的(这是用户在分辨率为 1280x720 的屏幕上看到的)Image Screen

这是用户得到的(图像分辨率 2560x1920)Final image

任何分辨率缩放canvas的解决方案只是用Canvas.setScale()方法缩放它。矩阵缩放从原点开始应用,默认情况下为屏幕左上角 (0,0),它通过 scaleX 和 scaleY 因子将 canvas 维度转换为任何其他维度从相机捕获的图像)按当前分辨率(设备分辨率)宽度和高度。

它基本上匹配捕获的图像和设备的屏幕尺寸。