Получение CGImage из NSView - PullRequest
       29

Получение CGImage из NSView

0 голосов
/ 06 августа 2010

Я пытаюсь создать CGImage из NSTextField.
Я добился определенного успеха в этом.Тем не менее я не могу получить 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 без цвета фона?

1 Ответ

1 голос
/ 06 августа 2010

-initWithFocusedViewRect: читает из хранилища окон, поэтому по сути это скриншот этой части окна.Вот почему вы получаете цвет фона окна в вашем изображении.

-[NSView cacheDisplayInRect:toBitmapImageRep:] очень похож, но заставляет перерисовывать вид и его подпредставления, но не его суперпредставления.Если ваше текстовое поле не имеет границ, этого может быть достаточно для вас.(Убедитесь, что вы используете -bitmapImageRepForCachingDisplayInRect: для создания NSBitmapImageRep!)

Есть еще один вариант, который можно считать даже более правильным, чем приведенный выше.NSTextField рисует свое содержимое, используя его NSTextFieldCell.На самом деле ничто не мешает вам просто создать изображение соответствующего размера, заблокировать на нем фокус и затем вызвать -drawInteriorWithFrame:inView:.Это должно просто нарисовать текст, точно так, как он нарисован в текстовом поле.

Наконец, если вы просто хотите нарисовать текст, не забудьте о NSStringDrawing.NSString имеет несколько методов, которые будут рисовать с атрибутами (drawAtPoint:withAttributes:), а NSAttributedString также имеет методы рисования (drawAtPoint:).Вы можете использовать один из них вместо того, чтобы просить NSTextFieldCell рисовать для вас.

...