在自定义相机PictureCallback()方法返回的图像上绘制具有正确方向的TextView

时间:2014-03-23 07:01:57

标签: android android-camera

我正在使用TextView构建自定义相机界面,当用户拍摄照片时,TextView会在屏幕上显示文字。我希望保存用户图像,并在用户在拍照时看到这个文字。

我在开始预览之前设置了mCamera.setDisplayOrientation(90);,一切看起来都很棒。但是当我尝试保存此图像时,在其上绘制的TextView图像最终会从文本旋转90度。

我不确定解决这个问题的最佳方法是什么。

理想情况下,我可以保存预览返回的图像,该图像似乎有正确的方向。

这是我的回调:

PictureCallback mPicture = new PictureCallback() {
  @Override
  public void onPictureTaken(byte[] data, Camera camera) {

    File pictureFile = getOutputMediaFile();
    Bitmap cameraBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
    cameraBitmap = cameraBitmap.copy(Bitmap.Config.ARGB_8888, true);
    Bitmap bmp = mTextView.getDrawingCache();
    Bitmap img = overlayImages(cameraBitmap, bmp);
    FileOutputStream fos = new FileOutputStream(pictureFile);

    img.compress(Bitmap.CompressFormat.PNG,90, fos);
    fos.flush();
    fos.close();
  }

将OverlayImages()定义为:

public Bitmap overlayImages(Bitmap background, Bitmap foreground) { 
    Canvas comboImage = new Canvas(background);
    comboImage.drawBitmap(foreground, 0, 0, null);
    return background;
}

有什么最好的方法在这里?管理方向似乎有很多问题。许多似乎涉及保存文件,然后检查EXIF信息。

这似乎比它需要的更复杂。

1 个答案:

答案 0 :(得分:0)

拍摄的照片是“自然”相机方向的Jpeg,通常是风景(即使自然设备方向是纵向,与Nexus 7或许多手机一样)。您可以使用EXIF信息来验证此角度,但实际上您可以为任何设备执行一次。请注意ExifInterface仅适用于文件,因此您必须(至少一次)将Jpeg数据保存到磁盘,然后才能为设备建立此角度。

之后,您无需分析EXIF信息即可知道到达回调的图片的真实方向。在大多数平板电脑上,它与您从OrientationEventListener收到的方向相同;在大多数手机上,它将偏离90°。

如果您的活动将屏幕方向锁定为纵向,这就是它显示文本的方式,并且您希望保存原始图像的文本覆盖完全按照用户在按下快门按钮之前看到屏幕,您不要关心真实的图片方向。因此,只需将图像旋转90°或0°,具体取决于设备。

如果要将图片保存为“自然”方向并且文本标题很好地对齐,则必须使用方向传感器并旋转文本和图像。

我不确定您上面的代码是否能产生正确的叠加层,因为cameraBitmap的尺寸和mTextView.getDrawingCache)的尺寸可能不合适。您可以将camerBitmap缩小到屏幕尺寸(适合文字bmp),但如果您将文字缩放到与cameraBitmap匹配,则无法取得良好效果。

更好的解决方案是使用图形库将文本覆盖在图像上,例如: MeiaUtil。它还可用于以Jpeg格式无损旋转摄像机图像。