1

我需要让用户在屏幕上移动图像并调整其大小。

那部分我已经完成了。

我无法弄清楚的部分是如何在拍照时冻结照片图像上的可移动/可调整大小的图像,而不是将两者合并在一起以制作 1 个位图。

我真的没有任何“代码片段”要发布。我只是希望有些人以前可能有过这方面的经验,并且可能会有所了解。

编辑。我知道当我拍照时,图像已经冻结在屏幕上。在那种情况下,我捕获了画布上的项目位置。我需要做的是拿走我已经画了一些东西的画布,并以某种方式将其覆盖到另一个我也分配了照片的画布上。

编辑#2

好的女士们先生们。我想到了。这是为相机制作叠加层的代码(如 mmeyer 所述。)

    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
    public void onPictureTaken(byte[] imageData, Camera c) {
        Context ct = new Context;

        RelativeLayout relativeview = new RelativeLayout(ct);
        if (imageData != null) {
            Context ct = HagsCamera.this;
            new Intent(ct, PreviewandSend.class);

        Bitmap photo = BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
        int picwidth= (photo.getWidth()/2);
        int picheight = (photo.getHeight()/2);

        Bitmap photocopy = Bitmap.createScaledBitmap(photo, picwidth, picheight,     false);
            Canvas c2 = crv.canvastoreturn;
            c2.setBitmap(photocopy);
        //photo.recycle();  

        ImageView newImage = new ImageView(ct);
        relativeview.addView(newImage);
        relativeview.draw(c2);
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                photo.getWidth()/2, photo.getHeight()/2);
        relativeview.setLayoutParams(lp);

祝大家好运。我希望这有助于避免很多头痛。

简而言之:为您的图片制作一张位图。
为您的叠加层制作一个画布并将您的东西扔到那里
获取您的叠加层画布的副本
.setBitmap() 该画布并将其设置为您的照片位图。
制作一个 RelativeLayout 并向其中添加一个新的 ImageView。
在 ImageView 上绘制画布。
然后找出RelativeLayout 的布局参数。

现在我想了想,也许您可​​以将顶层画布设置为您的照片位图……然后保存它……您可以自己测试。

4

1 回答 1

1

我过去做过一些事情,我在包含相机预览的表面视图之上有一个叠加视图。

当用户想要捕获图片时,我从 Camera.PreviewCallback.onPreviewFrame() 获取下一个预览帧,然后将其从 YUV 转换为位图。

然后,我得到一个针对该位图的画布,并将该画布传递给作为我的叠加视图的自定义视图类的 Draw() 方法,它会将在屏幕上绘制的任何内容绘制到我的新画布上!然后我可以获取位图并将其保存为 jpg/png 到 SD。

请注意,在该自定义视图类中,它必须处理缩放问题,因为当被要求在屏幕上绘制时获得的画布与被要求从预览帧绘制到画布上时给出的画布大小不同.

这里要注意预览尺寸和内存不足错误,尽管许多手机的默认预览帧尺寸非常大,并且使用画布绘制位图会快速消耗内存。了解如何使用 Bitmap.recycle() 以及如何监控本机堆以应对这些问题。

希望有帮助。

在阅读了后续评论和您遇到的黑色/空白图像问题后,我决定发布一些伪代码来展示我是如何做到这一点的......

// decode the camera data into an immutable bitmap
Bitmap raw = CameraHelper.decodeYUV(frameInfo.frameData, frameInfo.frameSize.x, frameInfo.frameSize.y);
frameInfo.frameData = null; // allow large bytearry to to get gc'd

Bitmap cameraPic = raw.copy(Bitmap.Config.RGB_565, true);   // make a mutable copy
Canvas c2 = (new Canvas(cameraPic));        // create a canvas from the camera pic

raw.recycle(); // we're done with raw bitmap now and can reclaim from native heap.

reticleOverlay.draw(c2); // reticle overlay is a class that implements View

String filename = acquireNextShotFilename()); // get a filename to write to SD
 FileOutputStream fileoutputStream;
try {
    fileoutputStream = new FileOutputStream(filename);
 } catch (FileNotFoundException e) {
    MyLogger.e("Couldnt open fileoutputstream: ", e);
    throw e;
}  

cameraPic.compress(CompressFormat.PNG, 100, fileoutputStream);
cameraPic.recycle();
try {
    fileoutputStream.flush();
    fileoutputStream.close();
} catch (IOException e) {
    MyLogger.e("Error writing to file: ", e);
    fileoutputStream.close();
} 
于 2011-05-26T15:18:38.087 回答