java - 如何在相机捕获的图像上叠加图像或 View

标签 java android eclipse image android-activity

我正在做的是将相机中的图像绘制到 canvas 上,然后将包含图像的 view 转换为 bitmap并将其绘制在 Canvas 上。然后最终的位图被保存到外部存储。

问题是 canvas 似乎将自身调整为预览窗口大小,而不是保存的图像大小。

这是我的 Activity 类中将捕获的 View 合并到相机图像之上的部分:

        Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0,
                imageData.length, options);
        Bitmap mutableBitmap = myImage.copy(Bitmap.Config.ARGB_8888, true);

        Paint paint = new Paint();
        Canvas canvas = new Canvas(mutableBitmap);

        view.setDrawingCacheEnabled(true);
        viewCapture = Bitmap.createBitmap(view.getDrawingCache());
        view.setDrawingCacheEnabled(false);
        canvas.drawBitmap(viewCapture, 0, 0, paint);

        fileOutputStream = new FileOutputStream(dir + "/" + imgName + ".jpg");

        BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
        mutableBitmap.compress(CompressFormat.JPEG, quality, bos);

这会将位图保存在捕获图像的顶部,但由于尺寸不同,它会偏移到左上角。

我通过在我的 surfaceChanged 中执行以下操作来设置不同的大小

  Camera.Parameters p = mCamera.getParameters();
  Camera.Size myBestPreviewSize = getBestPreviewSize(w, h, p);
  p.setPreviewSize(myBestPreviewSize.width, myBestPreviewSize.height);
  Camera.Size myBestPictureSize = getBestPictureSize(w, h, p);
  p.setPictureSize(myBestPictureSize.width, myBestPictureSize.height);

很明显,通过这样做,我获得了预览窗口的最佳分辨率,以及捕获图像的最佳分辨率。我相信这个问题是由两种不同的解决方案引起的,但要弄清楚为什么我会被困在那里。

希望以下图片能更好地描述问题:

此图像显示预览窗口。如您所见,Android 位于图像的中间。 enter image description here

我拍摄了上面的图像并将其保存。我去查看它,这就是它的样子: enter image description here

注意 Android 不再位于中间,而是位于左上角。

作为另一项测试,我将 android 部分移出了屏幕,如下一个相机预览所示 enter image description here

我完全按照上面显示的方式捕获图像,在查看它时,android 被完全切断了它在预览窗口中的样子,但它再次出现在左上角,而它应该是全屏的 enter image description here

最佳答案

从相机中检索到的位图将会非常庞大​​(超过 2000 像素宽)。您绘制图像的 SurfaceView 仅与您的设备分辨率一样大(~1000 像素宽)。当你把一个画到另一个上时,你需要缩放它,否则它最终会变成它应该大小的 1/2(如你的屏幕截图所示)。以下是我将如何修改您的代码。

view.setDrawingCacheEnabled(true);
viewCapture = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);
//Source Rect sized to the surface view.
Rect src = new Rect(0, 0, viewCapture.getWidth(), viewCapture.getHeight());
//Destination RectF sized to the camera picture
RectF dst = new RectF(0, 0, myImage.getWidth(), myImage.getHeight());
canvas.drawBitmap(viewCapture, src, dst, paint);

我知道您在设置相机参数和尺寸方面付出了一些努力,但要么它不起作用,要么您需要采取不同的方法。不过,我认为这应该可行。你的第二个屏幕截图,Android 人在两张图片中都被剪掉了,这表明这只是一个简单的缩放问题。

希望对您有所帮助!

关于java - 如何在相机捕获的图像上叠加图像或 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15260706/

相关文章:

android - 用Android Studio问题启动Flutter

c++ - 在 Eclipse CDT 中执行 sudo make install?

java - PlayN 的 2d vector 类?

java - 根据固定引用验证参数

java - 如何使用 JSTL 启动静态函数?如何读取字符串?

Java 没有关于所有 IANA 时区的信息

c# - 从 C# 自动化遗留 Java 应用程序

Android:替换 WebView 中的 HTML 标签

java - 如何将 Intent 字符串传递给新 Activity 中的 XML 小部件?

java - Eclipse EE 调色板不可用