NSBitmapImageRep и многостраничные TIFF - PullRequest
0 голосов
/ 21 августа 2009

У меня есть программа, которая может открывать документы TIFF и отображать их. Я использую setFlipped: ДА.

Если я просто имею дело с одностраничными файлами изображений, я могу сделать

[image setFlipped: YES];

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

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

Это важно, потому что несколько изображений многостраничного TIFF выглядят как разные «представления» одного и того же изображения. Итак, если я просто рисую ИЗОБРАЖЕНИЕ, оно переворачивается, но если я рисую конкретное представление, оно не переворачивается. Я также не могу понять, как выбрать, какое представление будет отображаться по умолчанию при рисовании NSImage.

спасибо.

Ответы [ 2 ]

1 голос
/ 27 августа 2009

Вы не должны использовать -setFlipped: метод, чтобы управлять тем, как изображение рисуется. Вы должны использовать преобразование, основанное на перемене контекста, в который вы рисуете. Примерно так (категория по NSImage):

@implementation NSImage (FlippedDrawing)
- (void)drawAdjustedInRect:(NSRect)dstRect fromRect:(NSRect)srcRect operation:(NSCompositingOperation)op fraction:(CGFloat)delta
{
    NSGraphicsContext* context = [NSGraphicsContext currentContext];
    BOOL contextIsFlipped      = [context isFlipped];

    if (contextIsFlipped)
    {
        NSAffineTransform* transform;

        [context saveGraphicsState];

        // Flip the coordinate system back.
        transform = [NSAffineTransform transform];
        [transform translateXBy:0 yBy:NSMaxY(dstRect)];
        [transform scaleXBy:1 yBy:-1];
        [transform concat];

        // The transform above places the y-origin right where the image should be drawn.
        dstRect.origin.y = 0.0;
    }

    [self drawInRect:dstRect fromRect:srcRect operation:op fraction:delta];

    if (contextIsFlipped)
    {
        [context restoreGraphicsState];
    }

}
- (void)drawAdjustedAtPoint:(NSPoint)point
{
    [self drawAdjustedAtPoint:point fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
}

- (void)drawAdjustedInRect:(NSRect)rect
{
    [self drawAdjustedInRect:rect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
}

- (void)drawAdjustedAtPoint:(NSPoint)aPoint fromRect:(NSRect)srcRect operation:(NSCompositingOperation)op fraction:(CGFloat)delta
{
    NSSize size = [self size];
    [self drawAdjustedInRect:NSMakeRect(aPoint.x, aPoint.y, size.width, size.height) fromRect:srcRect operation:op fraction:delta];
}
@end
0 голосов
/ 21 августа 2009

Я считаю, что ответом является то, что Да, разные страницы являются отдельными представлениями, и правильный способ справиться с ними - превратить их в изображения с:

NSImage *im = [[NSImage alloc] initWithData:[representation TIFFRepresentation]];
[im setFlipped:YES];
...