作者sheep922420 ()
看板AndroidDev
标题Re: [问题]Camera Preview 上加 ImageView
时间Wed Feb 26 22:07:52 2014
※ 引述《sheep922420 ()》之铭言:
: 如题
: 小弟目前在一个 FrameLayout 上
: 加了一个 surfaceView
: 并利用 Camera 在 surfaceView 全萤幕预览
: 并且要在预览画面加上一个可任意移动的图片(ImageView) 而且可以缩放
: 问题1 : 目前已经在画面加好 ImageView 了
: 可是 ImageView 只能在预览画面上 "一小块正方形区域" 做移动缩放
: 和目的 "可在预览画面上任意移动" 还差一大段距离
: 请问是该对 ImageView FrameLaout 或是 surfaceView 做参数设定?
: 或是有哪些关键字可以给小弟参考呢?
: 感谢板上高手!!! 谢谢!!
小弟在预览画面上的图片(ImageView) 和预览画面(surfaceview)做合成
可是在取出 已经移动和放大的 ImageView 内图片资料 转成 Bitmap的时候後一直会会发
生 Out Of Memory
处理照片合成的code如下
//===========================================================================
// JPEG CALLBACK函数内处理照片row data
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bm = BitmapFactory.decodeByteArray(_data, 0, _data.length,options);
//取得 已经移动和放大的 ImageView 内图片资料 转成 Bitmap
PicImageView.setDrawingCacheEnabled(true); <===========由logcat知道一直发
生 OOM 的点
Bitmap overlay = PicImageView.getDrawingCache(true);
File myCaptureFile = new File(strCaptureFilePath);
//把两个bitmap 画在同一个cave上
Bitmap bmOverlay = Bitmap.createBitmap(bm.getWidth(),
bm.getHeight(),
bm.getConfig());
Canvas canvas = new Canvas(bmOverlay);
canvas.drawBitmap(bottom, new Matrix(), null);
canvas.drawBitmap(overlay, 0, 0, null);
//存到我要的路径
File myCaptureFile = new File(strCaptureFilePath);
BufferedOutputStream bos = new BufferedOutputStream(new
FileOutputStream(myCaptureFile));
bmOverlay.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
//=============================================================================
找了许多网路资料
但是还是只bitmap很耗记忆体
想请问板上高手
我该从哪一点切入去修改??
感谢各位大大!!! >"<
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.34.228.96
1F:推 tac0wu:PicImageView 你这是Class 还是 Instance阿 02/26 23:13
2F:→ tac0wu:还有你这样开了好多memory 没有到必要不要用cache 你如果只 02/26 23:15
3F:→ sheep922420:是 Instance ~ 02/26 23:15
4F:→ tac0wu:是单纯图片 就拿你原来的Bitmap去画就好了 不要再多浪费 02/26 23:15
5F:→ tac0wu:一次记忆体 02/26 23:16
6F:→ tac0wu:还有你用甚麽device 如过正常一点的device 这三张bitmap应 02/26 23:17
7F:→ tac0wu:该不会搞到OOM 02/26 23:17
8F:→ sheep922420:是因为已经在预览画面上移动缩放了图片 02/26 23:18
9F:→ tac0wu:你加一些Log trace你的memory使用量 02/26 23:18
10F:→ tac0wu:你就用原图 加上一些matrix 画在canvas上就好了 不要偷懒 02/26 23:19
11F:→ sheep922420:希望存好的档案是 图片能够覆盖在照片上 02/26 23:19
12F:→ sheep922420:达到类似 在照片上的特定位置加上一个花俏的图片 02/26 23:21
13F:→ tac0wu:你拿出cache的图片 我猜是某张bitmap 经过scale translate 02/26 23:21
14F:→ sheep922420:并存成档案 02/26 23:21
15F:→ tac0wu:所以你会加很多张图片在照片上 02/26 23:22
16F:→ sheep922420:我的原图是 res/drable下的 png档 02/26 23:23
17F:→ tac0wu:你好像只加一个花俏图片 02/26 23:23
18F:→ sheep922420:大大的意思是直接用png档?? 02/26 23:23
19F:→ tac0wu:把png 读出来成bitmap後 让他在两个地方用到 02/26 23:24
20F:→ tac0wu:一个是画在你的ImageView的canvas上 一个就是画在你自己 02/26 23:24
21F:→ tac0wu:生成的canvas上 02/26 23:24
22F:→ sheep922420:目前是只有加一个, 会不会加到两个还不确定, 02/26 23:24
23F:→ sheep922420:是否加到两个, 我会再询问user 02/26 23:25
24F:→ tac0wu:你是怎麽让那张花俏图片变大变小移动的 是用带matrix进去吗 02/26 23:25
25F:→ sheep922420:是的,是在onTouch 方法中使用 matrix 来实做的 02/26 23:27
26F:→ tac0wu:那你就把matrix 那出来再将bitmap 画在你生成的canvas上就 02/26 23:29
27F:→ tac0wu:可以了 02/26 23:29
28F:→ tac0wu:那=>拿 02/26 23:29
29F:→ sheep922420:大大不好意思...不理解matrix 拿出来的意思?? 02/26 23:32
30F:→ tac0wu:getImageMatrix(); 02/26 23:33
31F:→ tac0wu:Canvas.drawBitmap(Bitmap, Matrix, Paint); 02/26 23:34
32F:→ sheep922420:虽然我还不太了解大大,说的用法,我先去查这些method 02/26 23:36
33F:→ sheep922420:的意思,和用法 02/26 23:36
34F:→ sheep922420:感谢 T.T 02/26 23:37
35F:推 tac0wu:不过 我觉得你的root cause应该不在这 除非你的机器真的太 02/26 23:39
36F:→ tac0wu:鸟了 02/26 23:39
37F:→ sheep922420:感觉上是指不用读出bitmap, 直接把图片在特定位置 02/26 23:39
38F:→ sheep922420:而且指定特定大小. 02/26 23:40
39F:→ tac0wu:直觉上的样子是 你有一张bitmap 你将他调整过後 画在另一张 02/26 23:40
40F:→ tac0wu:上面 最後在将那一张的bitmap 画在你最後生成的canvas上 02/26 23:41
41F:→ sheep922420:想确机器是否太鸟...我是该查询机器的哪几项规格呢?? 02/26 23:41
42F:→ tac0wu:你大可一开始就将你的bitmap 画在canvas上 02/26 23:41
43F:→ tac0wu:你直接说你用甚麽手机吧 查一下就知道了 02/26 23:42
44F:→ sheep922420:好的!!我照这个方式修该看看!! 02/26 23:42
45F:→ tac0wu:有可能是因为你是monitor解析度太高 然後手机版本又太旧 02/27 00:07
46F:→ tac0wu:单一app的memory上限很低 所以一下就撑破了 02/27 00:08