Как - NSAttributedString для CGImageRef

Я пишу плагин QuickLook. Ну все работает. Просто хочу попробовать сделать лучше ;). Отсюда вопрос.
Вот функция, которая возвращает уменьшенное изображение, которую я сейчас использую.

QLThumbnailRequestSetImageWithData(
QLThumbnailRequestRef thumbnail,
CFDataRef data,
CFDictionaryRef properties);
);

http://developer.apple.com/mac/library/documentation/UserExperience/Reference/QLThumbnailRequest_Ref/Reference/reference.html#//apple_ref/c/func/QLThumbnailRequestSetImageWithData

Прямо сейчас я создаю TIFF -> инкапсулирую его в NSData. Пример

// Setting CFDataRef
CGSize thumbnailMaxSize = QLThumbnailRequestGetMaximumSize(thumbnail);
NSMutableAttributedString *attributedString = [[[NSMutableAttributedString alloc] 
                                                   initWithString:@"dummy" 
                                                   attributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                                               [NSFont fontWithName:@"Monaco" size:10], NSFontAttributeName, 
                                                               [NSColor colorWithCalibratedRed:0.0 green:0.0 blue:0.0 alpha:1.0], NSForegroundColorAttributeName, 
                                                               nil]
                                                   ] autorelease];
NSImage *thumbnailImage = [[[NSImage alloc] initWithSize:NSMakeSize(thumbnailMaxSize.width, thumbnailMaxSize.height)] autorelease];
[thumbnailImage lockFocus];
[[NSColor whiteColor] set];
NSRectFill(NSMakeRect(0, 0, thumbnailMaxSize.width, thumbnailMaxSize.height));
[attributedString drawInRect:NSMakeRect(0, 0, thumbnailMaxSize.width, thumbnailMaxSize.height)];
[thumbnailImage unlockFocus];
(CFDataRef)[thumbnailImage TIFFRepresentation]; // This is data

// Setting CFDictionaryRef
(CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:@"kUTTypeTIFF", (NSString *)kCGImageSourceTypeIdentifierHint, nil ]; // this is properties

Однако QuickLook предоставляет другую функцию для возврата уменьшенного изображения, а именно

QLThumbnailRequestSetImage(
QLThumbnailRequestRef thumbnail,
CGImageRef image,
CFDictionaryRef properties);
);

http://developer.apple.com/mac/library/documentation/UserExperience/Reference/QLThumbnailRequest_Ref/Reference/reference.html#//apple_ref/c/func/QLThumbnailRequestSetImage

У меня есть ощущение, что передача CGImage в QL вместо данных TIFF поможет ускорить процесс. Однако я никогда раньше не работал с компьютерной графикой. Я знаю, документация есть :), но в любом случае может ли кто-нибудь привести пример, как превратить эту строку NSAttributed в CGImageRef. Пример стоит того, чтобы 10 раз прочитать документацию ;)
Любая помощь приветствуется. Заранее спасибо!


person kroko    schedule 28.04.2010    source источник


Ответы (1)


может ли кто-нибудь привести пример, как превратить эту строку NSAttributed в CGImageRef.

Вы не можете превратить строку в изображение; это два совершенно разных типа данных, и один из них двухмерный (символы во времени), а другой - как минимум трехмерный (цвет по x и y).

Что вам нужно сделать, так это нарисовать строку и создать изображение рисунка. Вот что вы сейчас делаете с NSImage: создаете изображение и рисуете в нем строку.

Вы спрашиваете о создании CGImage. Создание контекста растрового изображения с помощью Основной текст, чтобы нарисовать в нем строку и создать изображение содержимого контекста растрового изображения — один из способов сделать это.

Однако вы уже гораздо ближе к другому решению, если вам может потребоваться Snow Leopard. Вместо того, чтобы запрашивать у NSImage представление TIFF, запросить CGImage.

person Peter Hosey    schedule 28.04.2010