美文网首页iOS之MAC端开发MacOS开发 技术集锦
mac开发系列27:NSImageView图片裁剪

mac开发系列27:NSImageView图片裁剪

作者: 悲观患者 | 来源:发表于2017-08-14 12:19 被阅读44次

    展示图片通常是用NSImageView,然后设置它的image属性。但是很多时候,图片尺寸都不符合设计稿要求,这就需要进行图片裁剪了,如下所示:



    默认情况下,NSImageView的高宽比并不能改变其中image的高宽比,只会让它等比例缩放。当然,直接设置image.size的width和height也是不行的。
    行之有效的方法是,截取原图中的一部分,并用drawInRect将其绘制到一个符合设计尺寸的rect中,形成一张新图,代码如下:

        self.imageScaling = NSImageScaleAxesIndependently; // 高和宽各自缩放去适应目标区域,不保留原图高宽比
        self.image = 
            [NSImage imageWithSize:self.bounds.size 
                                      flipped:NO // 不翻转       
                  drawingHandler:^BOOL(NSRect dstRect) { 
                      NSSize imageSize = [image size]; // 原图尺寸 
                      NSSize imageViewSize = self.bounds.size; // imageView尺寸,暂时不明白为什么不用dstRect 
                      NSSize newImageSize = imageSize; // 初始化新图尺寸 
                      CGFloat imageAspectRatio = imageSize.height / imageSize.width; // 原图高宽比 
                      CGFloat imageViewAspectRatio = imageViewSize.height / imageViewSize.width; // imageView高宽比
                        // 相对imageView而言
                      if (imageAspectRatio < imageViewAspectRatio) {
                          // 宽图裁掉左右两块 
                          // Image is more horizontal than the view. Image left and right borders need to be cropped. 
                          newImageSize.width = imageSize.height / imageViewAspectRatio;
                       } else {
                              // 高图裁掉上下两块 
                              // Image is more vertical than the view. Image top and bottom borders need to be cropped. 
                          newImageSize.height = imageSize.width * imageViewAspectRatio; 
                       } 
                            // 按imageView的高宽比,截取原图的中间部分 
                        NSRect srcRect = NSMakeRect(imageSize.width / 2.0 - newImageSize.width / 2.0, 
                        imageSize.height / 2.0 - newImageSize.height / 2.0,
                        newImageSize.width, newImageSize.height);  
                       [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh]; // 高质量绘图 
                      [image drawInRect:dstRect  // 这里暂时不明白为什么用dstRect 
                      fromRect:srcRect 
                      operation:NSCompositeCopy 
                      fraction:1.0 // 完全不透明 
                  respectFlipped:YES 
                            hints:@{ NSImageHintInterpolation : @(NSImageInterpolationHigh) }]; 
                      return YES; 
                  }];
    

    参考链接:
    https://github.com/onekiloparsec/KPCScaleToFillNSImageView/blob/master/KPCScaleToFillNSImageView.m

    相关文章

      网友评论

        本文标题:mac开发系列27:NSImageView图片裁剪

        本文链接:https://www.haomeiwen.com/subject/eccurxtx.html