保存图像覆盖与相机捕获图像underneith

jam*_*mes 9 android

我的应用程序具有"photobooth"功能,允许用户使用相机拍照,同时在相机视图顶部显示叠加图像.拍照后,我需要保存用户在将图片带到文件系统时看到的内容.

我在开发解决方案时遇到了一个大问题:捕获具有兼容尺寸的图像,我可以在其中附加叠加图像,从而产生用户在拍照时看到的内容.

似乎我无法从具有定义尺寸的相机捕获图像(我必须从它们的列表中基本上选择).有些手机只能产生一定的尺寸.

由于我无法选择捕获图像的大小,似乎我需要包含许多不同大小的叠加图像,并将最佳匹配附加到捕获的图像.我不能只是拍摄相机图像顶部的任何旧叠加层,使其看起来正确.

问题:

  • 我是否过度复杂化了"相机图像+叠加图像创建"过程?
  • 在完成此任务时您有什么建议,而不需要包含多个不同大小的叠加图像?

编辑:这是我的解决方案(简要).请注意这不是一个完美的,也许不是最有效的方法,但它确实有效.有些事情可能是不必要/多余的,但无论如何

笔记:

  • 这对平板电脑设备来说效果不是很好.
  • 需要将叠加图像旋转到横向模式(即使您将拍摄手持图像的图像)
  • 叠加尺寸为480x320
  • 您需要在拍摄照片时强制将活动设置为横向模式(现在叠加层看起来像它的肖像!)
  • 我使用添加叠加图像视图 addContentView(overlayImageView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

...

final Camera.PictureCallback jpegCallback = new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        Bitmap mutableBitmap = null;
        try {
                    //for a PORTRAIT overlay and taking the image holding the phone in PORTRAIT mode
            mutableBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options).copy(Bitmap.Config.RGB_565, true);
            Matrix matrix = new Matrix();
            int width = mutableBitmap.getWidth();
            int height = mutableBitmap.getHeight();
            int newWidth = overlayImage.getDrawable().getBounds().width();
            int newHeight = overlayImage.getDrawable().getBounds().height();
            float scaleWidth = ((float) newWidth) / width;
            float scaleHeight = ((float) newHeight) / height;
            matrix.postScale(scaleWidth, scaleHeight);
            matrix.postRotate(90);

            Bitmap resizedBitmap = Bitmap.createBitmap(mutableBitmap, 0, 0, mutableBitmap.getWidth(), mutableBitmap.getHeight(), matrix, true);
            finalBitmap = resizedBitmap.copy(Bitmap.Config.RGB_565, true);
            Canvas canvas = new Canvas(finalBitmap);

            Bitmap overlayBitmap = BitmapFactory.decodeResource(getResources(), overlay);
            matrix = new Matrix();
            matrix.postRotate(90);
            Bitmap resizedOverlay = Bitmap.createBitmap(overlayBitmap, 0, 0, overlayBitmap.getWidth(), overlayBitmap.getHeight(), matrix, true);
            canvas.drawBitmap(resizedOverlay, 0, 0, new Paint());
            canvas.scale(50, 0);
            canvas.save();
            //finalBitmap is the image with the overlay on it
        }
        catch(OutOfMemoryError e) {
            //fail
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Lum*_*mis 1

我认为这是一个如何操纵叠加层的问题。您可以根据捕获的图像尺寸对其进行裁剪并调整其大小以适合,同时保留其比例。您可以通过将叠加层的比例与背景比例进行比较,将其放置到最佳位置。

我会保持覆盖层足够大,并具有宽边框(出血),以便使用滤镜轻松地将它们调整为图像大小,从而以良好的质量绘制它。我想覆盖层是你会设计并具有透明部分的东西,比如没有脸的小丑的图像,这样用户就可以将其他人的脸放入其中?