0

NSTextField から CGImage を作成しようとしています。
私はこれである程度成功しました。それでも、テキストだけで構成される CGImage を取得できません。つまり、テキストフィールドをキャプチャするたびに、背景ウィンドウの色を取得しています.(アルファチャンネル情報を取得していないようです)

http://www.cocoadev.com/index.pl?ConvertNSImageToCGImageのスニペットに従ってみました

 
NSBitmapImageRep * bm = [NSBitmapImageRep alloc];
[theView lockFocus];
[bitmap initWithFocusedViewRect:[theView bounds]];
[theView unlockFocus]

[bma retain];// data provider will release this
int     rowBytes, width, height;

rowBytes = [bm bytesPerRow];
width = [bm pixelsWide];
height = [bm pixelsHigh];

CGDataProviderRef provider = CGDataProviderCreateWithData( bm, [bm bitmapData], rowBytes * height, BitmapReleaseCallback );
CGColorSpaceRef colorspace = CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB );
CGBitmapInfo    bitsInfo = kCGImageAlphaPremultipliedLast;

CGImageRef img = CGImageCreate( width, height, 8, 32, rowBytes, colorspace, bitsInfo, provider, NULL, NO, kCGRenderingIntentDefault );

CGDataProviderRelease( provider );
CGColorSpaceRelease( colorspace );

return img;


背景色なしでCGImageを取得するのに役立ちますか?

4

1 に答える 1

1

-initWithFocusedViewRect:ウィンドウバッキングストアから読み取るため、基本的にはウィンドウのその部分のスクリーンショットです。そのため、画像でウィンドウの背景色を取得しています。

-[NSView cacheDisplayInRect:toBitmapImageRep:]は非常に似ていますが、ビューとそのサブビューが再描画されますが、スーパービューは再描画されません。テキスト フィールドが縁なしの場合は、これで十分かもしれません。(必ず-bitmapImageRepForCachingDisplayInRect:NSBitmapImageRep の作成に使用してください!)

上記よりもさらに正しいと考えられるオプションがもう 1 つあります。NSTextField は、その NSTextFieldCell を使用してコンテンツを描画します。適切なサイズの画像を作成し、その画像にフォーカスをロックして、-drawInteriorWithFrame:inView:. テキストフィールドに描かれたのとまったく同じように、テキストを描画するだけです。

最後に、テキストを描画するだけの場合は、忘れないでくださいNSStringDrawing。NSString には属性を使用して描画するメソッドがいくつかあり ( drawAtPoint:withAttributes:)、NSAttributedString にも描画メソッドがあります ( drawAtPoint:)。NSTextFieldCell に描画を依頼する代わりに、これらのいずれかを使用できます。

于 2010-08-06T13:52:43.757 に答える