Рисование миниатюр и предварительных просмотров в графическом контексте
Для предварительных просмотров или миниатюр документов, состоящих прежде всего или исключительно графики и изображений, лучший подход, который может проявить генератор, должен нарисовать изображение того документа в графическом контексте, предоставленном Беглым взглядом. Генератор составляет изображения документов непосредственно в клиенте — графические действия контекста как своего рода окно на поверхность клиентского приложения. Путем выполнения этого можно избежать издержек создания и сжатия изображения в собственный тип и затем требование, чтобы клиент распаковал и загрузил его на их конце. Три графических контекста доступны, каждый для различного вида документа:
Графический контекст для рисования того или более растровых изображений та адаптация на одной странице
Графический контекст для рисования того или более векторных изображений та адаптация на одной странице
Графический контекст для рисования многократных страниц векторных изображений
Рисование Изображений документов в Графическом Контексте описывает, как нарисовать миниатюру или предварительный просмотр для первых двух ситуаций. Рисование Предварительных просмотров в Контексте PDF обсуждает третий вид графического контекста и объясняет, как использовать его.
Рисование изображений документов в графическом контексте
Стратегия рисования предварительных просмотров единственной страницы и миниатюр в графическом контексте является тем же. Реализуйте надлежащую функцию обратного вызова —GenerateThumbnailForURL
или GeneratePreviewForURL
— считать данный документ (расположенный CFURLRef
параметр) в память. Тогда получите контекст графики Беглого взгляда с вызовом к QLThumbnailRequestCreateContext
или QLPreviewRequestCreateContext
и нарисуйте миниатюру или изображение предварительного просмотра в предоставленном контексте. Перечисление 5-1 показывает код для генерации предварительного просмотра документа Эскиза.
Перечисление 5-1 , Получающее предварительный просмотр Эскиза в контексте графики Беглого взгляда
OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options) |
{ |
@autoreleasepool{ |
// Create and read the document file |
SKTDrawDocument* document = [[SKTDrawDocument alloc] init]; |
if (![document readFromURL:(NSURL *)url ofType:(NSString *)contentTypeUTI]) { |
return noErr; |
} |
NSSize canvasSize = [document canvasSize]; |
// Preview will be drawn in a vectorized context |
CGContextRef cgContext = QLPreviewRequestCreateContext(preview, *(CGSize *)&canvasSize, false, NULL); |
if(cgContext) { |
NSGraphicsContext* context = [NSGraphicsContext graphicsContextWithGraphicsPort:(void *)cgContext flipped:YES]; |
if(context) { |
[document drawDocumentInContext:context]; |
} |
QLPreviewRequestFlushContext(preview, cgContext); |
CFRelease(cgContext); |
} |
} |
return noErr; |
} |
Перед рисованием предварительного просмотра или миниатюры в предоставленном графическом контексте удостоверьтесь, что Вы сохраняете текущий контекст и затем восстанавливаете тот контекст, когда Вы закончены, таща. Необходимо тогда сбросить контекст с QLPreviewRequestFlushContext
или QLThumbnailRequestFlushContext
и выпустите его как показано в вышеупомянутом примере.
QLPreviewRequestCreateContext
и QLThumbnailRequestCreateContext
функции имеют идентичные наборы параметров. Первый параметр идентифицирует запрос предварительного просмотра, или объект запроса миниатюры передал в обратный вызов. Другие параметры имеют более прямое влияние на создаваемый графический контекст.
Второй параметр (параметр назвал размер в объявлении функции) является размером изображения, которое будет нарисовано или в пикселях или в точках в зависимости от того, является ли графический контекст битовым массивом или вектором, соответственно.
Третий параметр (isBitmap) говорит Беглый взгляд, должен ли возвращенный графический контекст подойти для растрового изображения или векторной графики; в примере выше, оптимизированный вектором графический контекст требуют с a
false
значение.Четвертый и заключительный параметр является словарем свойств, которые можно пасовать назад к Беглому взгляду как подсказки для обработки нарисованного изображения; посмотрите Ссылку Ссылки и QLThumbnailRequest QLPreviewRequest для подробных данных.
Генератор, реализовывая GenerateThumbnailForURL
обратный вызов мог бы быть передан в каталоге опций значение с плавающей точкой, указывающее, сколько Беглого взгляда масштабирует изображение миниатюр. (Можно получить доступ к этому значению с помощью kQLThumbnailOptionScaleFactorKey
ключ.). Если Вы получение векторное изображение для миниатюры с помощью графического контекста возвратились из QLThumbnailRequestCreateContext
, Вы не должны волноваться о масштабировании изображения; просто рисуйте его обычно в данный размер, который находится в точках. Беглый взгляд создает контекст с указанным размером, умноженным на масштабный коэффициент в пикселях, но также и применяет надлежащее аффинное преобразование так, чтобы контекст получения, казалось, к генератору имел установленный размер.
Рисование предварительных просмотров в контексте PDF
Если Ваше приложение имеет документы, (потенциально) имеющие больше чем одну страницу векторной графики, необходимо рассмотреть использование QLPreviewRequestCreatePDFContext
функция для создания графического контекста для рисования предварительного просмотра в. Эта функция возвращает графический контекст, которому удовлетворяют для содержания PDF. Процедура подобна той, описанной в Рисовании Изображений документов в Графическом Контексте. Однако существуют некоторые важные различия:
Некоторые параметры
QLPreviewRequestCreatePDFContext
отличаются от техQLPreviewRequestCreateContext
:Второй параметр (mediaBox) является указателем на прямоугольник, определяющий расположение и размер страницы PDF.
Третий параметр (auxiliaryInfo) является словарем, содержащим вспомогательную информацию о PDF.
Необходимо предшествовать получению каждой страницы путем вызова
CGPDFContextBeginPage
и вызовитеCGPDFContextEndPage
когда Вы закончили рисовать страницу.
Как с QLPreviewRequestCreateContext
, когда Вы закончили рисовать предварительный просмотр, убеждаться вызвать QLPreviewRequestFlushContext
.