如何将几个NSImages组合成一个大图像?

问题描述:

我有一个描述图像名称,它的大小和它的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。

谢谢!

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

#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