Рисование миниатюр и предварительных просмотров в графическом контексте

Для предварительных просмотров или миниатюр документов, состоящих прежде всего или исключительно графики и изображений, лучший подход, который может проявить генератор, должен нарисовать изображение того документа в графическом контексте, предоставленном Беглым взглядом. Генератор составляет изображения документов непосредственно в клиенте — графические действия контекста как своего рода окно на поверхность клиентского приложения. Путем выполнения этого можно избежать издержек создания и сжатия изображения в собственный тип и затем требование, чтобы клиент распаковал и загрузил его на их конце. Три графических контекста доступны, каждый для различного вида документа:

Рисование Изображений документов в Графическом Контексте описывает, как нарисовать миниатюру или предварительный просмотр для первых двух ситуаций. Рисование Предварительных просмотров в Контексте 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 функции имеют идентичные наборы параметров. Первый параметр идентифицирует запрос предварительного просмотра, или объект запроса миниатюры передал в обратный вызов. Другие параметры имеют более прямое влияние на создаваемый графический контекст.

Генератор, реализовывая GenerateThumbnailForURL обратный вызов мог бы быть передан в каталоге опций значение с плавающей точкой, указывающее, сколько Беглого взгляда масштабирует изображение миниатюр. (Можно получить доступ к этому значению с помощью kQLThumbnailOptionScaleFactorKey ключ.). Если Вы получение векторное изображение для миниатюры с помощью графического контекста возвратились из QLThumbnailRequestCreateContext, Вы не должны волноваться о масштабировании изображения; просто рисуйте его обычно в данный размер, который находится в точках. Беглый взгляд создает контекст с указанным размером, умноженным на масштабный коэффициент в пикселях, но также и применяет надлежащее аффинное преобразование так, чтобы контекст получения, казалось, к генератору имел установленный размер.

Рисование предварительных просмотров в контексте PDF

Если Ваше приложение имеет документы, (потенциально) имеющие больше чем одну страницу векторной графики, необходимо рассмотреть использование QLPreviewRequestCreatePDFContext функция для создания графического контекста для рисования предварительного просмотра в. Эта функция возвращает графический контекст, которому удовлетворяют для содержания PDF. Процедура подобна той, описанной в Рисовании Изображений документов в Графическом Контексте. Однако существуют некоторые важные различия:

Как с QLPreviewRequestCreateContext, когда Вы закончили рисовать предварительный просмотр, убеждаться вызвать QLPreviewRequestFlushContext.