作者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