2012-02-06 5 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を作成しています。アプリからの画像を与えて、それにバックグラウンド変数として上記のメソッドの結果を与えます。私はこれが役立つことを願っています – 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コマンドの描画のいくつかのパラメータを変更する必要がありますか? – 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 
} 
関連する問題