【问题标题】:Android get bitmap from camera, scale canvas to bitmap size and save bitmapAndroid从相机获取位图,将画布缩放到位图大小并保存位图
【发布时间】:2016-11-25 07:45:30
【问题描述】:

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

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

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

    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

【问题讨论】:

  • then get that mutable bitmap from the stream。对不起,你走得快。来自哪个流?来自相机?
  • 从相机获取位图没有问题。在获取它并将其设置为画布的位图后,问题就开始了。是的,从 onPictureTaken 方法的数据中获取位图。使用 inMutable 选项使其适合通过画布在其上绘制。但是分辨率转换是我失败的地方。
  • 我从相机获得的位图比绘制线条文本的画布更大。我放大画布以匹配位图尺寸,但文本和绘图位置不在他们应该在的位置。
  • Yes get bitmap from data from onPictureTaken method。 data 包含一个 jpg 图像。我想您正在将自己转换为位图。正如您在这篇文章的主题中所说,您没有从相机中获取位图。现在你说的那个流在哪里?
  • 如果原始位图(来自数据)是 4096x3024,您想将其调整为 1280x720 但得到 2560x1920 吗?我不能跟着你。究竟是什么问题?

标签: android canvas bitmap camera scale


【解决方案1】:

为任何分辨率缩放画布的解决方案就是使用Canvas.setScale() 方法对其进行缩放。矩阵缩放从原点应用,即 (0,0),默认情况下位于屏幕的左上角,它通过 scaleX 和 scaleY 因子将画布尺寸转换为任何其他尺寸,您可以通过分割所需的分辨率(从相机)按当前分辨率(设备分辨率)宽度和高度。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多