Как сделать NSAttributedString для CGImageRef - PullRequest
0 голосов
/ 28 апреля 2010

Я пишу плагин 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 поможет ускорить процесс. Однако я никогда раньше не работал с CG-контекстом. Я знаю, документация есть :), но в любом случае - кто-нибудь может привести пример, как превратить эту строку NSAttributed в CGImageRef. Пример стоит 10 раз прочитать документацию;)
Любая помощь приветствуется. Заранее спасибо!

1 Ответ

0 голосов
/ 28 апреля 2010

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

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

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

Вы спрашиваете о создании CGImage. Создание растрового контекста , использование Core Text для рисования строки в нем и создание изображения содержимого растрового контекста - один из способов сделать это.

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

...