0

我有一个 NSImage 里面有不同的图像。它内部图像的位置将始终保持不变,因此我需要指定一个矩形来获取矩形位置在图像内部的子图像。怎么可能做到这一点?

4

2 回答 2

3

为什么一个图像中有多个图像?过早优化?

无论如何,当您绘制图像时,您传递的参数之一就是您想要的图像部分。通常,您传递图像的边界或零矩形(两者的含义相同),但如果需要,您可以传递子矩形。

如果目标矩形比源矩形大,它将按比例放大(不成比例);如果它更小,它将按比例缩小(不成比例地)。如果您不想进行任何缩放,请调整目标矩形的大小以匹配源矩形的大小。

如果您想将绘图留给 NSImageView,请创建一个所需大小的空 NSImage,然后在其中绘制,然后将该图像传递给图像视图。这可能会破坏您希望通过将这些全部混合到一个图像中获得的任何性能优势。

您还可以创建 NSView、NSImageView 或 CALayer 的自定义子类,该子类具有 NSImage 的属性和源矩形的属性,并且仅绘制该部分。

于 2010-07-24T03:33:44.163 回答
0

从 macOS 10.6 开始,这很容易。此代码获取包含多个剪辑的主图像并提取该主图像的一部分以生成剪辑图像。

// masterImage is the source image that contains multipe clips
NSImage *masterImage = [NSImage imageNamed:@"multiple_images.jpg"];
NSRect mFrame = NSMakeRect(0, 0, masterImage.size.width, masterImage.size.height);
NSImageRep *representation = [masterImage bestRepresentationForRect:mFrame
                                                            context:nil
                                                              hints:nil];

#define TARGET_IMAGE_SIZE    40 // NSImageView size (where the clip will be used)
NSSize targetSize = NSMakeSize(TARGET_IMAGE_SIZE, TARGET_IMAGE_SIZE);
NSImage *clippedImage = [NSImage imageWithSize:targetSize
                                       flipped:NO
                                drawingHandler:^BOOL(NSRect dstRect) {

    // set clipRect according to which clip you want:
    float xPos = 0; // compute these ...
    float yPos = 0; // ... positions of the clip within masterImage
    float clipSize = 50; // assumes each clip is square
    NSRect clipRect = NSMakeRect(xPos, yPos, clipSize, clipSize);

    BOOL ret = [representation drawInRect:dstRect
                                 fromRect:clipRect
                                operation:NSCompositingOperationCopy
                                 fraction:1.0 // alpha
                           respectFlipped:NO
                                    hints:nil];
    return ret; // ret from drawingHandler
}];

NSRect ivFrame = NSMakeRect( 0, 0, TARGET_IMAGE_SIZE, TARGET_IMAGE_SIZE);
NSImageView *clipImageView = [[NSImageView alloc] initWithFrame:ivFrame];
clipImageView.image = clippedImage;

提示:使用循环,布局“N” NSImageViews (其中“N”是剪辑的数量),将每个剪辑提取到其中一个 imageViews 中,并弄清楚如何计算每个剪辑的 xPos、yPos 和剪辑大小 (clipRect)夹子。当您可以一次查看所有剪辑时会更容易。

于 2020-06-27T05:22:18.167 回答