作者zonble (zonble)
看板MacDev
標題Re: [問題] 使用方框剪裁相機預覽畫面遇到的問題
時間Sat Aug 14 21:03:46 2010
※ 引述《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
推 klern:謝謝解答! 第一個部分是前者 在drawRect我使用NSBezierPath 08/14 21:47
→ klern:在使用mouse method時 有呼叫setNeedsDisplay 但不知為什麼 08/14 21:48
→ klern:拖曳後 放開滑鼠左鍵 方框會繼續移動 有點延遲(?)的狀況 08/14 21:49
→ klern:因為我這是要額外加在別的程式上的功能 所以要整個改成 08/14 21:50
→ klern:CoreAnimation做 有點不太方便 再度謝謝你!! 08/14 21:51
→ zonble:因為整個 view redraw 還頂慢的,建議打幾個 NSLog 上去 08/15 00:04
→ zonble:看看是不是mouseup之後,還在畫 mousedrag 的時候的東西 08/15 00:04
→ klern:謝謝 我在嘗試看看! 08/15 00:16
→ klern:目前嘗試了CALayer 利用Layer的frame做拖曳 但畫面會出現 08/18 09:57
→ klern:拖曳過的殘影 請問這有辦法解決嗎 謝謝 08/18 09:58
→ zonble:你是直接把 layer 疊在 image view 上嗎? 08/18 15:56
→ zonble:通常這樣會有問題,建議把圖片也放在另一個 CALayer 裡 08/18 15:56
→ klern:我列出我部分程式碼 CALayer *rootLayer = [CALayer layer]; 08/18 16:07
→ klern:rootLayer.contents = [self layer].contents; 08/18 16:07
→ klern:[[self layer] addSublayer:rootLayer]; 08/18 16:08
→ klern:rootLayer在addSubLayer:裁切Layer 08/18 16:09
推 klern:謝謝:) 08/18 19:54