2010-03-04 57 views
15

我有一個描述圖像名稱,它的大小和它的X/Y位置的對象的集合。該集合按「圖層」排序,因此我可以用某種畫家的算法合成圖像​​。如何將幾個NSImages組合成一個大圖像?

從這個,我能確定需要保持所有圖像的矩形,所以現在我想要做的是:

  • 建立某種形式的緩存來保存結果(NS相當於什麼iPhoneOS調用UIGraphicsContext。)
  • 將所有圖像繪製到緩衝區中。
  • 從緩衝區的合成結果中剔除新的NSImage。

在的iPhoneOS,這是代碼,我想要做什麼:

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

我正在尋找的是如何做到這一點的桌面可可/ NS。

謝謝!

回答

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

檢查Apple's Drawing Guide爲更長,更詳細的答案。

+1

文檔說在Snow-Leopard中棄用。 「重要提示:如果您正在編寫新代碼或更新舊代碼,則應避免使用此方法,而應使用drawAtPoint:fromRect:operation:fraction:或drawInRect:fromRect:operation:fraction:method來繪製儘管該方法本身並未被棄用,但它提供的行爲並不推薦用於一般用途。「 但我會嘗試drawAtPoint,如果它有效,給你正確的答案複選標記。 (你可能想編輯你的答案。) 謝謝! – Olie 2010-03-04 00:45:56

+0

呼叫良好。編輯。我認爲,原因是繪製檢查源矩形和複合不。這很好,只要你確定你傳遞了一個明智的矩形(它也更快一些),但使用draw會更安全。 – andyvn22 2010-03-04 06:38:14

+0

是的,lockFocus是我失蹤的東西(這樣一個直觀的名字,我無法想象我怎麼沒有想到檢查文檔!) 謝謝! – Olie 2010-03-05 15:25:21

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 
相關問題