作者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
1F:推 klern:谢谢解答! 第一个部分是前者 在drawRect我使用NSBezierPath 08/14 21:47
2F:→ klern:在使用mouse method时 有呼叫setNeedsDisplay 但不知为什麽 08/14 21:48
3F:→ klern:拖曳後 放开滑鼠左键 方框会继续移动 有点延迟(?)的状况 08/14 21:49
4F:→ klern:因为我这是要额外加在别的程式上的功能 所以要整个改成 08/14 21:50
5F:→ klern:CoreAnimation做 有点不太方便 再度谢谢你!! 08/14 21:51
6F:→ zonble:因为整个 view redraw 还顶慢的,建议打几个 NSLog 上去 08/15 00:04
7F:→ zonble:看看是不是mouseup之後,还在画 mousedrag 的时候的东西 08/15 00:04
8F:→ klern:谢谢 我在尝试看看! 08/15 00:16
9F:→ klern:目前尝试了CALayer 利用Layer的frame做拖曳 但画面会出现 08/18 09:57
10F:→ klern:拖曳过的残影 请问这有办法解决吗 谢谢 08/18 09:58
11F:→ zonble:你是直接把 layer 叠在 image view 上吗? 08/18 15:56
12F:→ zonble:通常这样会有问题,建议把图片也放在另一个 CALayer 里 08/18 15:56
13F:→ klern:我列出我部分程式码 CALayer *rootLayer = [CALayer layer]; 08/18 16:07
14F:→ klern:rootLayer.contents = [self layer].contents; 08/18 16:07
15F:→ klern:[[self layer] addSublayer:rootLayer]; 08/18 16:08
16F:→ klern:rootLayer在addSubLayer:裁切Layer 08/18 16:09
18F:推 klern:谢谢:) 08/18 19:54