新鮮な文脈で画像を合成する?

ある画像を別の画像に描画し、その合成画像を画像ファイルとして出力しようとしています。このメソッドは最初に呼び出すときに正常に機能しますが、後続の呼び出しでは最後の合成時に別の画像がレイヤーされます。私。新しい背景画像を取得する代わりにレイヤーを維持します。

私は自分自身を明確にして(説明するのは少し難しい)、どんな助けでも大いに感謝してくれることを願っています。

-(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
@ParagBafna私はNSImageを作成しています。これはアプリの援助の画像を与え、それにバックグラウンド変数として上記のメソッドの結果を与えることです。私はこれが役立つことを願っています
追加された 著者 BenJacob,
どのように背景画像をこの関数に渡していますか?
追加された 著者 Parag Bafna,

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.
}
1
追加された
私はテストする人を持っていません...誰でも網膜の画面上でどれくらいうまく動作しているかを確認できますか?単純に@ 2xの画像を使っていますか、またはrectコマンドの描画のいくつかのパラメータを変更する必要がありますか?
追加された 著者 ArtOfWarfare,

パラグバフナの答え、スウィフト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
}
0
追加された