Использование операции NSImage для создания эффекта обрезки - PullRequest
0 голосов
/ 24 августа 2010

У меня есть NSView, который отображает изображение, и я хотел бы, чтобы этот вид работал как эффект обрезки изображения.Затем я делаю 3 прямоугольника (imageRect, secRect и IntersectRect), imageRect - это прямоугольник, который показывает изображение, secRect - это прямоугольник, который просто затемняет все imageRect, и intersectRect это прямоугольник, который похож на прямоугольник наблюдения, что я хотел бы сделать, это сделать «дыру» на secRect, чтобы видеть прямо в imageRect (без затемнения).Вот мой метод drawRect:

- (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];

}

У меня есть свой собственный класс (myDrawRect) для рисования прямоугольника, основанного на щелчке мыши по [self bounds], поэтому просто игнорируйте команду beginDrawing.

Любая помощь будет в порядке, спасибо.Хебб.

1 Ответ

4 голосов
/ 25 августа 2010

Вы выполняете гораздо больше работы, чем нужно, и используете устаревшие методы (методы compositeToPoint:operation: и compositeToPoint:fromRect:operation:fraction:) для этого.

Все, что вам нужно сделать, это отправить изображение drawInRect:fromRect:operation:fraction: сообщение . Параметр fromRect: - это прямоугольник, который вы хотите обрезать; если вы не хотите масштабировать обрезанный участок, то целевой прямоугольник (параметр drawInRect:) должен иметь такой же размер.

О единственной дополнительной работе, которую вам, возможно, понадобится выполнить, - это если изображение может быть больше, чем вид, и вы хотите нарисовать только тот участок, который находится в пределах границ вида: когда это произойдет, вам нужно будет вставить прямоугольник кадрирования по разнице в размерах между прямоугольником кадрирования и границами вида.

...