2009-08-20 5 views
0

J'ai un programme qui peut ouvrir des documents TIFF et les afficher. J'utilise setFlipped: YES.NSBitmapImageRep et TIFF multi-pages

Si je suis juste traiter des fichiers d'image uniques de la page, je peux faire

[image setFlipped: YES]; 

et que, en plus de la vue étant renversé, semble dessiner l'image correctement.

Toutefois, pour une raison quelconque, la définition du retournement de l'image ne semble pas affecter le retournement des représentations individuelles. Ceci est pertinent parce que les images multiples d'un TIFF de plusieurs pages semblent apparaître comme des "représentations" différentes de la même image. Donc, si je dessine juste l'image, elle est retournée, mais si je dessine une représentation spécifique, elle n'est pas retournée. Je n'arrive pas non plus à comprendre comment choisir la représentation par défaut qui est dessinée lorsque vous dessinez le NSImage.

merci.

Répondre

0

Je crois que la réponse est que oui, les différentes pages sont des représentations distinctes, et la bonne façon de les traiter est de les transformer en images avec:

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

Vous ne devriez pas utiliser le -setFlipped : méthode pour contrôler comment l'image est dessinée. Vous devez utiliser une transformation basée sur le retournement du contexte dans lequel vous dessinez. Quelque chose comme ça (une catégorie sur 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

Ce fut la première technique que j'ai essayé, mais pour une raison quelconque, les transformations ne se sont exécuté la première fois que je dessinais l'image, quand je redimensionnées la fenêtre , l'image est devenue à l'envers ... –

Questions connexes