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

Я пытаюсь создать 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 без цвета фона?


person shakthi    schedule 06.08.2010    source источник


Ответы (1)


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

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

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

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

person kperryua    schedule 06.08.2010
comment
На самом деле, я собираюсь генерировать текстуры из CGImage. В любом случае спасибо за ваше решение, я скоро вернусь. - person shakthi; 06.08.2010
comment
Это нормально. Все вышеперечисленные методы создают NSImage или NSBitmapImageRep, из которых вы можете создать CGImage. - person kperryua; 06.08.2010