2012-02-06 2 views
2

하나의 이미지를 다른 이미지 위에 그린 다음 해당 이미지를 이미지 파일로 출력하려고합니다. 이 메소드는 처음 호출 할 때 제대로 작동하지만 후속 호출은 마지막 컴포지트에서 다른 이미지를 레이어합니다. 나는. 그것은 새로운 배경 이미지를 얻기보다는 레이어링을 유지합니다.새로운 컨텍스트로 이미지 합성 하시겠습니까?

나는 (내가 설명하기가 조금 어렵다.) 어떤 도움을 주시면 감사하겠습니다.

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

}

+0

스위프트 3에서 어떻게이 기능에 배경 이미지를 전달하는? –

+0

@ParagBafna 나는 NSImage를 만들고, app recourses로부터 이미지를주고, 위 메소드의 결과를 배경 변수로 제공한다. 이게 도움이 되길 바란다. – BenJacob

답변

1

당신은 그것을 그리기 전에 이미지를 복사해야합니다, 그래서 당신은 원본을 변경하지 마십시오.

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

나는 테스트 할 사람이 하나도 없다.이 사람이 망막 스크린에서 얼마나 잘 작동하는지 확인할 수 있는가? @ 2x 이미지를 사용하는 것만으로 충분합니까? 아니면 rect 명령에서 draw의 일부 매개 변수를 변경해야합니까? – ArtOfWarfare

0

Parag Bafna의 대답,

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 
}