2010-03-04 3 views
15

Ich habe eine Sammlung von Objekten, die einen Bildnamen, seine Größe und seine X/Y-Position beschreiben. Die Sammlung ist nach "Ebenen" sortiert, so dass ich die Bilder in einer Art Maler-Algorithmus zusammensetzen kann.Wie mehrere NSImages zu einem großen Bild zusammengesetzt werden?

Daraus kann ich das Rechteck bestimmen notwendig, alle Bilder zu halten, so dass jetzt, was ich tun möchte, ist:

  • eine Art Puffer Erstellen Sie das Ergebnis (der NS-Äquivalent zu halten, was iPhoneOS ruft UIGraphicsContext auf.)
  • Zeichnen Sie alle Bilder in den Puffer.
  • Snag einen neuen NSUmage aus dem Composite-Ergebnis des Puffers.

In iPhoneOS, das ist der Code, der das tut, was ich will:

UIGraphicsBeginImageContext (woSize); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    [[UIColor clearColor] set]; 
    CGContextFillRect(ctx, NSMakeRect(0, 0, woSize.width, woSize.height)); 
    // draw my various images, here. 
    // i.e. Various repetitions of [myImage drawAtPoint:somePoint]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Was ich suche ist, wie das in der Desktop-Cocoa/NS zu tun.

Danke!

Antwort

19
NSImage* resultImage = [[[NSImage alloc] initWithSize:imageSize] autorelease]; 
[resultImage lockFocus]; 

[anotherImage drawAtPoint:aPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 
// Or any of the other about 6 options; see Apple's guide to pick. 

[resultImage unlockFocus]; 

prüfen Apple's Drawing Guide für eine viel längere, ausführlichere Antwort.

+1

Docs sagen Veraltet in Snow Leopard. "Wichtig: Wenn Sie neuen Code schreiben oder alten Code aktualisieren, sollten Sie diese Methode vermeiden. Verwenden Sie stattdessen den drawAtPoint: fromRect: operation: fraction: oder drawInRect: fromRect: operation: fraction: Methode zum Zeichnen Das Bild selbst. Obwohl die Methode selbst nicht veraltet ist, wird das Verhalten, das sie bietet, nicht zur allgemeinen Verwendung empfohlen. " Aber ich werde DrawAtPoint versuchen und, wenn es funktioniert, geben Sie das richtige Antwort-Häkchen. (Vielleicht möchten Sie Ihre Antwort bearbeiten.) Vielen Dank! – Olie

+0

Guter Anruf. Bearbeitet. Der Grund, nehme ich an, ist, dass draw die Quelle rect überprüft und composite nicht. Das ist in Ordnung, solange du sicher bist, dass du eine vernünftige Rect passierst (und es ist auch etwas schneller), aber es ist in der Tat sicherer, Draw zu verwenden. – andyvn22

+0

Yeah, lockFocus war das, was mir fehlte (so ein intuitiver Name, ich kann mir nicht vorstellen, WIE ich nicht daran gedacht hätte, die Dokumente dafür zu überprüfen!) Danke! – Olie

0
#import <Cocoa/Cocoa.h> 

@interface CompositeView : NSView { 
    NSImage *bottom; 
    NSImage *top; 
} 
- (IBAction)takeBottomFrom: (id)aView; 
- (IBAction)takeTopFrom: (id)aView; 
@end 

#import "CompositeView.h" 

@implementation CompositeView 
- (IBAction)takeBottomFrom: (id)aView 
{ 
    id img = [[aView image] retain]; 
    [bottom release]; 
    bottom = img; 
    [self setNeedsDisplay: YES]; 
} 

- (IBAction)takeTopFrom: (id)aView 
{ 
    id img = [[aView image] retain]; 
    [top release]; 
    top = img; 
    [self setNeedsDisplay: YES]; 
} 

- (void)drawRect:(NSRect)rect 
{ 
    NSCompositingOperation op = 0; 
    NSRect bounds = [self bounds]; 
    NSSize imageSize = bounds.size; 
    imageSize.width /= 7; 
    imageSize.height /= 2; 

    NSRect bottomRect = { {0,0}, [bottom size] }; 
    NSRect topRect = { {0,0}, [top size] }; 

    for (unsigned y=0 ; y<2 ; y++) 
    { 
     for (unsigned x=0 ; x<7 ; x++) 
     { 
      NSRect drawRect; 

      drawRect.origin.y = y * imageSize.height; 
      drawRect.origin.x = x * imageSize.width; 
      drawRect.size = imageSize; 

      [bottom drawInRect: drawRect 
         fromRect: bottomRect 
        operation: NSCompositeCopy 
         fraction: 1]; 

      [top drawInRect: drawRect 
        fromRect: topRect 
        operation: op++ 
        fraction: 1]; 
     } 
    } 
} 

- (id)initWithFrame:(NSRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code here. 
    } 
    return self; 
} 

@end 
Verwandte Themen