如何将多个 NSImage 合成为一张大图像?

发布于 2024-08-23 13:01:17 字数 753 浏览 2 评论 0原文

我有一个对象集合,描述图像名称、其大小及其 X/Y 位置。该集合按“层”排序,因此我可以用某种画家的算法合成图像​​。

由此,我可以确定保存所有图像所需的矩形,所以现在我想做的是:

  • 创建某种缓冲区来保存结果(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();

我正在寻找的是如何在 Desktop Cocoa/NS 中执行此操作。

谢谢!

I have a collection of objects which describe an image-name, its size and it's X/Y location. The collection is sorted by "layers", so I can composite the images in a sort of painter's algorithm.

From this, I can determine the rectangle necessary to hold all of the images, so now what I want to do is:

  • Create some sort of buffer to hold the result (The NS equivalent of what iPhoneOS calls UIGraphicsContext.)
  • Draw all the images into the buffer.
  • Snag a new NSImage out of the composited result of the buffer.

In iPhoneOS, this is the code that does what I want:

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

What I'm looking for is how to do that in Desktop Cocoa/NS.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

開玄 2024-08-30 13:01:17
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 绘图指南 提供更长、更详细的答案。

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

Check Apple's Drawing Guide for a much longer, more detailed answer.

瞳孔里扚悲伤 2024-08-30 13:01:17
#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
#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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文