Композиция изображений с новым контекстом?

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

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

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

}


person BenJacob    schedule 06.02.2012    source источник
comment
Как вы передаете фоновое изображение этой функции?   -  person Parag Bafna    schedule 06.02.2012
comment
@ParagBafna Я создаю NSImage, предоставляя ему изображение из ресурсов приложения, а затем предоставляя ему результат вышеуказанного метода с самой собой в качестве фоновой переменной. Надеюсь, это поможет.   -  person BenJacob    schedule 06.02.2012


Ответы (2)


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

-(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.
}
person Parag Bafna    schedule 06.02.2012
comment
У меня нет такого, чтобы протестировать... Может ли кто-нибудь проверить, насколько хорошо это работает на экране сетчатки? Достаточно ли просто использовать изображения @2x или нужно изменить некоторые параметры команды draw in rect? - person ArtOfWarfare; 21.06.2012

Ответ Парага Бафны в Swift 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
}
person onmyway133    schedule 03.08.2017