使用NSImage操作来制作裁剪效果

时间:2010-08-24 17:32:45

标签: objective-c cocoa nsimage

我有一个显示图像的NSView,我想让这个视图像裁剪图像效果。然后我制作了3个矩形(imageRectsecRectIntersectRect),imageRect是显示图像的矩形,secRect是矩形,只是作用于使整个imageRect变暗,而intersectRect是一个像观察矩形一样的矩形,我想做的就像在secRect上做一个“洞”直接看到{{1} (没有变暗)。这是我的drawRect方法:

imageRect

我有自己的类(myDrawRect)来基于鼠标点击- (void)drawRect:(NSRect)rect { // Drawing code here. NSImage *image = [NSImage imageNamed:@"Lonely_Tree_by_sican.jpg"]; NSRect imageRect = [self bounds]; [image compositeToPoint:NSZeroPoint operation:NSCompositeSourceOver ]; if (NSIntersectsRect([myDrawRect currentRect], [self bounds])) { //get the intersectionRect intersectionRect = NSIntersectionRect([myDrawRect currentRect], imageRect); //draw the imageRect [image compositeToPoint:imageRect.origin operation:NSCompositeSourceOver]; //draw the secRect and fill it with black and alpha 0.5 NSRect secRect = NSMakeRect(imageRect.origin.x, imageRect.origin.y, imageRect.size.width, imageRect.size.height); [[NSColor colorWithCalibratedRed:0.0 green:0.0 blue:0.0 alpha:0.5] set]; [NSBezierPath fillRect:secRect]; //have no idea for the intersectRect /*[image compositeToPoint:intersectionRect.origin fromRect:secLayer operation:NSCompositeXOR fraction:1.0];*/ } //draw the rectangle [myDrawRect beginDrawing]; } 绘制一个矩形,所以只需忽略[self bounds]命令。

任何帮助都没关系,谢谢。赫布。

1 个答案:

答案 0 :(得分:4)

您所做的工作远远超出了您的需求,并且您正在使用弃用的方法(compositeToPoint:operation:compositeToPoint:fromRect:operation:fraction:方法)来执行此操作。

您需要做的就是将图片发送一个drawInRect:fromRect:operation:fraction: messagefromRect:参数是您要裁剪的矩形;如果您不想缩放裁剪的部分,那么目标矩形(drawInRect:参数)应该具有相同的大小。

关于您可能需要做的唯一额外工作是,如果图像可能比视图大,并且您只想绘制视图边界内的部分:当发生这种情况时,您需要{{3}裁剪矩形与裁剪矩形和视图边界之间的大小差异。