【问题标题】:Clipping NSImage around certain NSRect在某些 NSRect 周围裁剪 NSImage
【发布时间】:2011-03-20 09:57:49
【问题描述】:

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

【问题讨论】:

    标签: objective-c cocoa nsimage clipping image-clipping


    【解决方案1】:

    为什么一张图片中有多个图片?过早的优化?

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

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

    如果您想将绘图留给 NSImageView,create an empty NSImage of the desired size,然后在其中绘制,然后将该图像传递给图像视图。这可能会破坏您希望通过将这些全部混合到一个图像中获得的任何性能优势。

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

    【讨论】:

      【解决方案2】:

      从 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”是剪辑的数量), 将每个剪辑提取到其中一个 imageView 中, 并弄清楚如何计算每个剪辑的 xPos、yPos 和剪辑大小 (clipRect)。 一次查看所有剪辑会更容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 2023-01-27
        • 2017-07-08
        • 1970-01-01
        • 1970-01-01
        • 2015-06-05
        相关资源
        最近更新 更多