Композиция изображений с новым контекстом? - PullRequest
2 голосов
/ 06 февраля 2012

Я пытаюсь нарисовать одно изображение на другом, а затем вывести это составное изображение в виде файла изображения. Метод работает нормально при первом вызове, но любые последующие вызовы накладывают другое изображение на последний композит. То есть он сохраняет слои, а не получает новое фоновое изображение.

Надеюсь, я ясно дал понять (это немного сложно объяснить), любая помощь будет высоко ценится.

-(NSImage *)compositeImage:(NSImage *)overlay Onto:(NSImage *)background AtPoint:(NSPoint)location{
NSImage *returnImage;

[background lockFocus];

[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
[overlay drawInRect:NSMakeRect(location.x, location.y, [overlay size].width, [overlay size].width) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];

[background unlockFocus];

returnImage = background;

return returnImage;

}

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Вы должны скопировать изображение перед его рисованием, чтобы не менять оригинал.

-(NSImage *)compositeImage:(NSImage *)overlay Onto:(NSImage *)background AtPoint:(NSPoint)location{
NSImage * backgroundCopy = [background copy]; 
[backgroundCopy lockFocus];
[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
[overlay drawInRect:NSMakeRect(location.x, location.y, [overlay size].width, [overlay size].width) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
[backgroundCopy unlockFocus];
return backgroundCopy; //release this object in calling function.
}
0 голосов
/ 03 августа 2017

Ответ Параг Бафны, в Свифте 3

func draw(image: NSImage, onto backgroundImage: NSImage) -> NSImage? {
  guard let canvas = backgroundImage.copy() as? NSImage else {
    return nil
  }

  canvas.lockFocus()
  NSGraphicsContext.current()?.imageInterpolation = NSImageInterpolation.high
  image.draw(at: .zero,
             from: NSRect(origin: .zero, size: backgroundImage.size),
             operation: .sourceOver,
             fraction: 1.0)

  canvas.unlockFocus()

  return canvas
}
...