2010-03-04 11 views
15

Mam kolekcję obiektów, które opisują nazwę obrazu, jego rozmiar i jego lokalizację X/Y. Kolekcja jest sortowana według "warstw", więc mogę złożyć obrazy w pewien rodzaj algorytmu malarskiego.Jak połączyć kilka NSImages w jeden duży obraz?

Z tego, mogę określić prostokąt niezbędnej do przechowywania wszystkich zdjęć, więc teraz to, co chcę zrobić, to:

  • Tworzenie jakiś bufor do przechowywania wyniku (NS równowartość co iPhoneOS wzywa UIGraphicsContext.)
  • Draw wszystkie obrazy do bufora.
  • pniaka nowy NSImage z wmontował wyniku buforze.

W iPhoneOS, jest to kod, który robi to, co chcę:

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(); 

Co szukam jest, jak to zrobić w Cocoa pulpitu/NS.

Dzięki!

Odpowiedz

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]; 

Aby uzyskać znacznie dłuższą, bardziej szczegółową odpowiedź, sprawdź numer Apple's Drawing Guide.

+1

Docs powiedzieć Przestarzałe w Snow-Leopard. „. Ważne: Jeśli piszesz nowy kod, lub aktualizowanie starego kodu, należy unikać stosowania tej metody Zamiast tego należy użyć drawAtPoint: fromRect: Operation: frakcja: albo drawInRect: fromRect: Operation: Frakcja: Metoda rysować Mimo że sama metoda nie jest przestarzała, jej zachowanie nie jest zalecane do ogólnego użytku. " Ale spróbuję drawAtPoint, a jeśli to zadziała, podaję poprawny znacznik odpowiedzi. (Możesz edytować odpowiedź.) Dzięki! – Olie

+0

Dobra rozmowa. Edytowane. Powód, jak zakładam, polega na tym, że sprawdzanie wyciągu nie ma źródła prostego i złożonego. To jest w porządku, o ile jesteś pewny, że przekazujesz sensowny rect (i jest trochę szybszy), ale w rzeczywistości jest bezpieczniej korzystać z drawa. – andyvn22

+0

Tak, lockFocus było czego mi brakuje (np intuicyjny nazwa, nie mogę sobie wyobrazić, jak ja nie sądzę, aby sprawdzić docs że;) Dzięki! – 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 
Powiązane problemy