12

私はCGImageRef(元の画像と呼びましょう)と透明なpng(透かし)を持っています。オリジナルの上に透かしを配置し​​、CGImageRef を返すメソッドを作成しようとしています。

iOS では、UIKit を使用して両方をコンテキストに描画していましたが、OSX ではそれができないようです (UIKit をサポートしていません)。

2 つの画像を重ねる最も簡単な方法は何ですか? ありがとう

4

3 に答える 3

5

にレンダリングすると、これは非常に簡単ですCGContext

結果として画像が必要な場合は、 を作成してレンダリングし、レンダリングCGBitmapContext後に画像をリクエストできます。

共通の詳細とコンテキスト情報を省略した一般的なフロー:

CGImageRef CreateCompositeOfImages(CGImageRef pBackground,
                                   const CGRect pBackgroundRect,
                                   CGImageRef pForeground,
                                   const CGRect pForegroundRect)
{
  // configure context parameters
  CGContextRef gtx = CGBitmapContextCreate( %%% );

  // configure context

  // configure context to render background image
  // draw background image
  CGContextDrawImage(gtx, pBackgroundRect, pBackground);

  // configure context to render foreground image
  // draw foreground image
  CGContextDrawImage(gtx, pForegroundRect, pForeground);

  // create result
  CGImageRef result = CGBitmapContextCreateImage(gtx);

  // cleanup

  return result;
}

PNG から CGImage を作成する必要があります。

使用に興味があるかもしれないその他の API:

  • CGContextSetBlendMode
  • CGContextSetAllowsAntialiasing
  • CGContextSetInterpolationQuality.

一般に、より高いレベルの抽象化 (AppKit と UIKit など) を使用するようにアドバイスする人が多いことは承知していますが、CoreGraphics は、これらの両方のコンテキストでレンダリングするための優れたライブラリです。OS X と iOS の両方で簡単に使用できるグラフィックスの実装に関心がある場合、これらの抽象化を快適に使用できる場合は、CoreGraphics を作業のベースとして使用することをお勧めします。

于 2013-09-03T07:10:18.300 に答える
4

私のような誰かが Swift バージョンを必要とする場合。

これは機能する Swift 5 バージョンです。

let background = NSImage(named: "background")
let overlay = NSImage(named: "overlay")

let newImage = NSImage(size: background.size)
newImage.lockFocus()

var newImageRect: CGRect = .zero
newImageRect.size = newImage.size

background.draw(in: newImageRect)
overlay.draw(in: newImageRect)

newImage.unlockFocus()

CGContext の例で同じことをする時間があればいいのにと思います。

于 2020-06-06T04:00:54.760 に答える