Re: [問題] 使用方框剪裁相機預覽畫面遇到的問題

看板MacDev作者 (zonble)時間15年前 (2010/08/14 21:03), 編輯推噓2(2016)
留言18則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《klern (灰)》之銘言: : 首先 先大概介紹我要做的程式 : 用一個NSImageView連結上相機的預覽視窗, 藉此可以看到相機的預覽畫面 這邊稍微有點看不太清楚,所謂相機上的預覽視窗,有可能是代表 把外接相機當做 webcam 錄進 video stream,也可能是把已經拍好的 照片讀進來,在 Cocoa 所提供的物件中,前者可以用 QTCaptureView, 後者可以用 IKCameraView,一個是 QuickTime 的東西,一個是 ImageKit 的東西,NSImageView 頂多就是載入 NSImage 而已…所以,這邊應 該是指,反正就是透過某種方法,讀到 NSImage 中,接著放到 NSImageView 裡頭。 : 另外 在drawRect畫上一個能夠拖曳以及調整尺寸的方格 來圈取想剪裁的部分 : 但是我遇到了問題... : 當我尚未開啟畫面預覽時(藉由按鈕觸發), 我的方格拖曳以及調整尺寸功能可以正常運作 : 而當我開啟畫面預覽時 當我拖曳或調整尺寸時 方格的位置都會跑掉 : 我拖曳及調整尺寸的功能是使用mousedown mouseup mousedrag這幾個method 聽起來應該是 drawRect: 的時候,在做影像上面重疊一個外框的地方 沒有處理好,這邊講得不太清楚,不知道是用 NSBezierPath 還是用 CoreGraphics 在畫。我可以想到的大概有兩點: 1. 在做了 mouseUp mouseDown 之後,是不是有確實要求你的 ImageView 重繪,是不是都有呼叫 setNeedsDisplay?會不會外框位置跑掉, 原因是並沒有 redraw 呢? 2. 如果不打算管 10.4 之前的版本,你要的 UI 可能會比較適合用 CoreAnimation 做,因為一直呼叫某個 NSView 重繪,老實說效能 不會很好。 如果是用 CoreAnimation,上方的裁切框,只要再加入一個 CALayer 就好,CALayer 的 interface 基本上跟 NSView 差不多,但是直接 就可以設定外框顏色與粗細,所以,如果我們把原本的 View 的 layer 的 content 設成那張圖片,裁切框設定成另外一個有外框的 layer, 那麼,要調整裁切框範圍,其實就只是設定這個 layer 的 frame 而已,比在 drawRect: 裡頭自己寫怎麼繪製內容好懂許多。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.42.194.204

08/14 21:47, , 1F
謝謝解答! 第一個部分是前者 在drawRect我使用NSBezierPath
08/14 21:47, 1F

08/14 21:48, , 2F
在使用mouse method時 有呼叫setNeedsDisplay 但不知為什麼
08/14 21:48, 2F

08/14 21:49, , 3F
拖曳後 放開滑鼠左鍵 方框會繼續移動 有點延遲(?)的狀況
08/14 21:49, 3F

08/14 21:50, , 4F
因為我這是要額外加在別的程式上的功能 所以要整個改成
08/14 21:50, 4F

08/14 21:51, , 5F
CoreAnimation做 有點不太方便 再度謝謝你!!
08/14 21:51, 5F

08/15 00:04, , 6F
因為整個 view redraw 還頂慢的,建議打幾個 NSLog 上去
08/15 00:04, 6F

08/15 00:04, , 7F
看看是不是mouseup之後,還在畫 mousedrag 的時候的東西
08/15 00:04, 7F

08/15 00:16, , 8F
謝謝 我在嘗試看看!
08/15 00:16, 8F

08/18 09:57, , 9F
目前嘗試了CALayer 利用Layer的frame做拖曳 但畫面會出現
08/18 09:57, 9F

08/18 09:58, , 10F
拖曳過的殘影 請問這有辦法解決嗎 謝謝
08/18 09:58, 10F

08/18 15:56, , 11F
你是直接把 layer 疊在 image view 上嗎?
08/18 15:56, 11F

08/18 15:56, , 12F
通常這樣會有問題,建議把圖片也放在另一個 CALayer 裡
08/18 15:56, 12F

08/18 16:07, , 13F
我列出我部分程式碼 CALayer *rootLayer = [CALayer layer];
08/18 16:07, 13F

08/18 16:07, , 14F
rootLayer.contents = [self layer].contents;
08/18 16:07, 14F

08/18 16:08, , 15F
[[self layer] addSublayer:rootLayer];
08/18 16:08, 15F

08/18 16:09, , 16F
rootLayer在addSubLayer:裁切Layer
08/18 16:09, 16F

08/18 18:25, , 17F
08/18 18:25, 17F

08/18 19:54, , 18F
謝謝:)
08/18 19:54, 18F
文章代碼(AID): #1CPfGrKq (MacDev)
文章代碼(AID): #1CPfGrKq (MacDev)