NSBitmapImageRep и многостраничные файлы TIFF

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

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

[image setFlipped: YES];

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

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

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

благодаря.


person Brian Postow    schedule 20.08.2009    source источник


Ответы (2)


Вы не должны использовать метод -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
person Rob Keniger    schedule 27.08.2009
comment
Это был первый метод, который я попробовал, но по какой-то причине преобразования выполнялись только при первом рисовании изображения, поэтому, когда я изменил размер окна, изображение стало перевернутым... - person Brian Postow; 27.08.2009

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

NSImage *im = [[NSImage alloc] initWithData:[representation TIFFRepresentation]];
[im setFlipped:YES];
person Brian Postow    schedule 21.08.2009