美文网首页
NSImageView保留图片上部

NSImageView保留图片上部

作者: 皮蛋豆腐酱油 | 来源:发表于2020-03-18 14:48 被阅读0次
    self.imgTip.imageScaling = NSImageScaleAxesIndependently;
    self.imgTip.image = [NSImage imageWithSize:self.imgTip.bounds.size
                                flipped:NO // 不翻转
            drawingHandler:^BOOL(NSRect dstRect) {
                NSSize imageSize = [image size]; // 原图尺寸
                NSSize imageViewSize = self.imgTip.bounds.size; // imageView尺寸
                NSSize newImageSize = imageSize; // 初始化新图尺寸
                CGFloat imageViewAspectRatio = imageViewSize.height / imageViewSize.width; // imageView高宽比
                  // 相对imageView而言
                newImageSize.height = imageSize.width * imageViewAspectRatio;
                // 按imageView的高宽比,截取原图的上面
                NSRect srcRect = NSMakeRect(0,
                imageSize.height - newImageSize.height,
                newImageSize.width, newImageSize.height);
                [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh]; // 高质量绘图
                [image drawInRect:dstRect
                fromRect:srcRect
                operation:NSCompositeCopy
                fraction:1.0 // 完全不透明
            respectFlipped:YES
                      hints:@{ NSImageHintInterpolation : @(NSImageInterpolationHigh) }];
                return YES;
            }];
    

    参考自:
    作者:悲观患者
    链接:https://www.jianshu.com/p/4febaa8ee4fb
    来源:简书
    展示图片通常是用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; 
                  }];

    相关文章

      网友评论

          本文标题:NSImageView保留图片上部

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