0

我有一个可以打开 TIFF 文档并显示它们的程序。我正在使用 setFlipped:YES。

如果我只是处理单页图像文件,我可以

[image setFlipped: YES];

而且,除了被翻转的视图之外,似乎正确地绘制了图像。

但是,由于某种原因,设置图像的翻转似乎不会影响单个表示的翻转。

这是相关的,因为多页 TIFF 的多个图像似乎显示为同一图像的不同“表示”。所以,如果我只画 IMAGE,它就会翻转,但如果我画一个特定的表示,它就不会翻转。我似乎也无法弄清楚如何选择哪个表示是绘制 NSImage 时绘制的默认表示。

谢谢。

4

2 回答 2

1

您不应该使用 -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
于 2009-08-27T09:44:19.897 回答
0

我相信答案是肯定的,不同的页面是不同的表示,正确的处理方法是将它们变成图像:

NSImage *im = [[NSImage alloc] initWithData:[representation TIFFRepresentation]];
[im setFlipped:YES];
于 2009-08-21T14:30:49.270 回答