问题描述
||
我需要让用户在屏幕上四处移动图像并调整其大小。
我已经完成了那部分。
我不知道的部分是,在拍照后,如何将可移动/可调整大小的图像冻结在照片图像上,而不是将两者合并为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,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的布局参数。
现在,我考虑了一下,也许您可以将顶层画布设置为Photo \'s Bitmap并保存即可……您可以自己进行测试。
解决方法
过去,我做了一些操作,其中在可容纳相机预览的表面视图之上有一个叠加视图。
当用户想要捕获图片时,我从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();
}