Re: [問題]Camera Preview 上加 ImageView

看板AndroidDev作者時間10年前 (2014/02/26 22:07), 編輯推噓2(2044)
留言46則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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

02/26 23:13, , 1F
PicImageView 你這是Class 還是 Instance阿
02/26 23:13, 1F

02/26 23:15, , 2F
還有你這樣開了好多memory 沒有到必要不要用cache 你如果只
02/26 23:15, 2F

02/26 23:15, , 3F
是 Instance ~
02/26 23:15, 3F

02/26 23:15, , 4F
是單純圖片 就拿你原來的Bitmap去畫就好了 不要再多浪費
02/26 23:15, 4F

02/26 23:16, , 5F
一次記憶體
02/26 23:16, 5F

02/26 23:17, , 6F
還有你用甚麼device 如過正常一點的device 這三張bitmap應
02/26 23:17, 6F

02/26 23:17, , 7F
該不會搞到OOM
02/26 23:17, 7F

02/26 23:18, , 8F
是因為已經在預覽畫面上移動縮放了圖片
02/26 23:18, 8F

02/26 23:18, , 9F
你加一些Log trace你的memory使用量
02/26 23:18, 9F

02/26 23:19, , 10F
你就用原圖 加上一些matrix 畫在canvas上就好了 不要偷懶
02/26 23:19, 10F

02/26 23:19, , 11F
希望存好的檔案是 圖片能夠覆蓋在照片上
02/26 23:19, 11F

02/26 23:21, , 12F
達到類似 在照片上的特定位置加上一個花俏的圖片
02/26 23:21, 12F

02/26 23:21, , 13F
你拿出cache的圖片 我猜是某張bitmap 經過scale translate
02/26 23:21, 13F

02/26 23:21, , 14F
並存成檔案
02/26 23:21, 14F

02/26 23:22, , 15F
所以你會加很多張圖片在照片上
02/26 23:22, 15F

02/26 23:23, , 16F
我的原圖是 res/drable下的 png檔
02/26 23:23, 16F

02/26 23:23, , 17F
你好像只加一個花俏圖片
02/26 23:23, 17F

02/26 23:23, , 18F
大大的意思是直接用png檔??
02/26 23:23, 18F

02/26 23:24, , 19F
把png 讀出來成bitmap後 讓他在兩個地方用到
02/26 23:24, 19F

02/26 23:24, , 20F
一個是畫在你的ImageView的canvas上 一個就是畫在你自己
02/26 23:24, 20F

02/26 23:24, , 21F
生成的canvas上
02/26 23:24, 21F

02/26 23:24, , 22F
目前是只有加一個, 會不會加到兩個還不確定,
02/26 23:24, 22F

02/26 23:25, , 23F
是否加到兩個, 我會再詢問user
02/26 23:25, 23F

02/26 23:25, , 24F
你是怎麼讓那張花俏圖片變大變小移動的 是用帶matrix進去嗎
02/26 23:25, 24F

02/26 23:27, , 25F
是的,是在onTouch 方法中使用 matrix 來實做的
02/26 23:27, 25F

02/26 23:29, , 26F
那你就把matrix 那出來再將bitmap 畫在你生成的canvas上就
02/26 23:29, 26F

02/26 23:29, , 27F
可以了
02/26 23:29, 27F

02/26 23:29, , 28F
那=>拿
02/26 23:29, 28F

02/26 23:32, , 29F
大大不好意思...不理解matrix 拿出來的意思??
02/26 23:32, 29F

02/26 23:33, , 30F
getImageMatrix();
02/26 23:33, 30F

02/26 23:34, , 31F
Canvas.drawBitmap(Bitmap, Matrix, Paint);
02/26 23:34, 31F

02/26 23:36, , 32F
雖然我還不太了解大大,說的用法,我先去查這些method
02/26 23:36, 32F

02/26 23:36, , 33F
的意思,和用法
02/26 23:36, 33F

02/26 23:37, , 34F
感謝 T.T
02/26 23:37, 34F

02/26 23:39, , 35F
不過 我覺得你的root cause應該不在這 除非你的機器真的太
02/26 23:39, 35F

02/26 23:39, , 36F
鳥了
02/26 23:39, 36F

02/26 23:39, , 37F
感覺上是指不用讀出bitmap, 直接把圖片在特定位置
02/26 23:39, 37F

02/26 23:40, , 38F
而且指定特定大小.
02/26 23:40, 38F

02/26 23:40, , 39F
直覺上的樣子是 你有一張bitmap 你將他調整過後 畫在另一張
02/26 23:40, 39F

02/26 23:41, , 40F
上面 最後在將那一張的bitmap 畫在你最後生成的canvas上
02/26 23:41, 40F

02/26 23:41, , 41F
想確機器是否太鳥...我是該查詢機器的哪幾項規格呢??
02/26 23:41, 41F

02/26 23:41, , 42F
你大可一開始就將你的bitmap 畫在canvas上
02/26 23:41, 42F

02/26 23:42, , 43F
你直接說你用甚麼手機吧 查一下就知道了
02/26 23:42, 43F

02/26 23:42, , 44F
好的!!我照這個方式修該看看!!
02/26 23:42, 44F

02/27 00:07, , 45F
有可能是因為你是monitor解析度太高 然後手機版本又太舊
02/27 00:07, 45F

02/27 00:08, , 46F
單一app的memory上限很低 所以一下就撐破了
02/27 00:08, 46F
文章代碼(AID): #1J3VKwU0 (AndroidDev)
文章代碼(AID): #1J3VKwU0 (AndroidDev)