2010-08-06 4 views
0

Я пытаюсь создать CGImage из NSTextField.
У меня был некоторый успех в этом. Тем не менее я не могу получить CGImage, состоящий только из текста. Я хочу сказать, что каждый раз, захватив текстовое поле я получаю цвет фона окна вместе с ним. (Похоже, я не получаю информацию об альфа-канале)Извлечение CGImage из NSView

Я попробовал следующий фрагмент из 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

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

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

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

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

+0

На самом деле, я собираюсь генерировать текстуры из CGImage. В любом случае спасибо за твое солн, я скоро вернусь. – shakthi

+0

Все в порядке. Все вышеперечисленные методы создают NSImage или NSBitmapImageRep, из которых вы можете создать CGImage. – kperryua

+0

Его работая отлично, спасибо. – shakthi