iPhone:Quartz 2Dを使用して画像を変換する
-
06-07-2019 - |
質問
CGContextRefを使用して、画像にいくつかの変換を適用しようとしています。私はCGContextTranslateCTM、CGContextScaleCTM、およびCGContextRotateCTM関数を使用していますが、物事を単純にするために、最初のものだけに焦点を合わせましょう。次のコードが正確に元の画像を生成する理由を疑問に思っていました!何か不足していますか?
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef g = CGBitmapContextCreate((void*) pixelData,
width,
height,
RGBA_8_BIT,
bytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedLast);
CGContextSetShouldAntialias(g, YES);
CGContextSetInterpolationQuality(g, kCGInterpolationHigh);
CGContextTranslateCTM( g,translateX, translateY );
CGImageRef tempImg = CGBitmapContextCreateImage (g);
CGContextDrawImage( g, CGRectMake (0, 0, width, height), tempImg );
CGContextRelease(g);
CGColorSpaceRelease( colorSpace );
また、翻訳後、この画像上に別の画像をどのように描画するかを部分的に透明にする方法(例:アルファ= 0.5)。
よく検索しましたが、答えが見つかりませんでした。助けていただければ幸いです...:
pixelDataからコンテキストを作成していることに注意してください。tempImgは翻訳後に作成されます。元の画像は現在作成されているため、初期化には何も問題はありませんが、問題は翻訳にあります。
解決
グラフィックス状態への変換は、後続の描画操作にのみ影響します。既存の画像データは変更されません。画像に変換を適用する場合は、次のようなものを試してください:
- 空のCGContextを作成します(iPhoneでは、UIGraphicsBeginImageContextを使用します)
- グラフィックス状態の変換、拡大縮小、回転
- 既存の画像を描画します。
- 新しいCGContextから画像を取得(iPhoneではUIGraphicsGetImageFromCurrentImageContextを使用)
ステップ3を実行すると、変換が適用された既存の画像が新しいグラフィックコンテキストに描画されます。ここでのコツは、変換を適用するために、実際に何かを描画する必要があることです。
この方法で変換を行うと、本当にクールなことができます。画像の半分を描画し、いくつかの変換を適用して、さらに描画することができます。
他のヒント
他の回答で述べたように、変換は後続の描画操作にのみ適用されます。開始したピクセルバッファには影響しません。
したがって、描画操作が必要です。解決策は、 CGImageを作成; その画像の描画は描画操作であるため、現在の変換行列(CTM)に従います。
ステップバイステップ:
- 空のピクセルデータでコンテキストを作成します。 (バッファーに
NULL
を渡すと、Quartzがバッファーを作成する必要があります。これはMacでも動作します。) - 変換したい描画したいピクセルデータで画像を作成します。
- コンテキストでCTMを変換します。
- 画像を描画します。
画像を描画した後 、CGBitmapContextCreateImage()を呼び出す必要があります。
その後、最初の画像の上に別の画像を描画し、CGBitmapContextCreateImage()を再度呼び出して2番目の画像を取得できます。 CGContextSetAlpha(ctx、alphaValue);
を使用してアルファを設定できます。