gpt4 book ai didi

java - 使用可调整大小/可重新定位的项目覆盖相机,而不是单击将图像合并在一起

转载 作者:行者123 更新时间:2023-11-30 04:40:09 25 4
gpt4 key购买 nike

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

那部分我已经完成了。

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

我真的没有任何代码“fragment ”可以发布。我只是希望有些人以前可能有过这方面的经验,并且可能愿意阐明一些问题。

编辑。我知道当我拍照时图像已经卡住在屏幕上。在那种情况下,我会在 Canvas 上捕获项目位置。我需要做的是把我已经画过东西的 Canvas 以某种方式叠加到我也指定了照片的另一个 Canvas 上。

编辑 #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);

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

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

现在我考虑了一下,也许您可​​以将顶层 Canvas 设置为照片的位图...然后保存它...您可以自己测试。

最佳答案

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

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

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

请注意,在该自定义 View 类中,它必须处理缩放,因为当被要求在屏幕上绘制时它获得的 Canvas 与被要求在 Canvas 上绘制时获得的 Canvas 大小不同预览框。

请注意此处的预览大小和内存不足错误,因为许多手机的默认预览帧大小都非常大,并且使用 Canvas 绘制位图会快速消耗内存。了解如何使用 Bitmap.recycle() 以及如何监控 native 堆以解决这些问题。

希望对您有所帮助。

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

// 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();
}

关于java - 使用可调整大小/可重新定位的项目覆盖相机,而不是单击将图像合并在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6130572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com