2010-03-04 42 views
15

Tôi có một bộ sưu tập các đối tượng mô tả tên hình ảnh, kích thước của nó và vị trí X/Y của nó. Bộ sưu tập được sắp xếp theo "lớp", vì vậy tôi có thể tổng hợp các hình ảnh trong một loại thuật toán của họa sĩ.Làm cách nào để tổng hợp một số hình ảnh NSImage thành một hình ảnh lớn?

Từ đó, tôi có thể xác định hình chữ nhật cần thiết để giữ tất cả các hình ảnh, vì vậy bây giờ những gì tôi muốn làm là:

  • Tạo một số loại đệm để giữ kết quả (The NS tương đương với những gì iPhoneOS gọi UIGraphicsContext.)
  • Vẽ tất cả hình ảnh vào bộ đệm.
  • Tạo hình ảnh NSImage mới ra khỏi kết quả tổng hợp của bộ đệm.

Trong iPhoneOS, đây là đoạn code mà làm những gì tôi muốn:

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

Những gì tôi đang tìm kiếm là làm thế nào để làm điều đó trong Desktop Cocoa/NS.

Cảm ơn!

Trả lời

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

Kiểm tra Apple's Drawing Guide để có câu trả lời dài hơn, chi tiết hơn.

+1

Tài liệu nói Không được chấp nhận trong Snow-Leopard. "Quan trọng: Nếu bạn đang viết mã mới hoặc cập nhật mã cũ, bạn nên tránh sử dụng phương pháp này. Thay vào đó, bạn nên sử dụng phương thức drawAtPoint: fromRect: operation: fraction: hoặc drawInRect: fromRect: operation: fraction: để vẽ hình ảnh. Mặc dù bản thân phương thức này không bị phản đối, nhưng hành vi mà nó cung cấp không được khuyến cáo sử dụng chung. " Nhưng tôi sẽ thử drawAtPoint và nếu nó hoạt động, hãy cung cấp cho bạn dấu kiểm đúng câu trả lời. (Bạn có thể muốn chỉnh sửa câu trả lời của mình.) Cảm ơn! – Olie

+0

Cuộc gọi tốt. Đã chỉnh sửa. Lý do, tôi giả định, là vẽ kiểm tra nguồn rect và composite không. Điều này là tốt miễn là bạn chắc chắn rằng bạn đang đi qua một rect hợp lý (và nó nhanh hơn một chút, quá) nhưng nó thực sự là an toàn hơn để sử dụng vẽ. – andyvn22

+0

Vâng, lockFocus là thứ tôi đã mất tích (một cái tên trực quan như vậy, tôi không thể tưởng tượng được làm thế nào tôi không nghĩ đến việc kiểm tra tài liệu cho điều đó!)) Cảm ơn! – 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 
Các vấn đề liên quan