NSImageView保留圖片上部

self.imgTip.imageScaling = NSImageScaleAxesIndependently;
self.imgTip.image = [NSImage imageWithSize:self.imgTip.bounds.size
                            flipped:NO // 不翻轉(zhuǎn)
        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高寬比
              // 相對(duì)imageView而言
            newImageSize.height = imageSize.width * imageViewAspectRatio;
            // 按imageView的高寬比,截取原圖的上面
            NSRect srcRect = NSMakeRect(0,
            imageSize.height - newImageSize.height,
            newImageSize.width, newImageSize.height);
            [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh]; // 高質(zhì)量繪圖
            [image drawInRect:dstRect
            fromRect:srcRect
            operation:NSCompositeCopy
            fraction:1.0 // 完全不透明
        respectFlipped:YES
                  hints:@{ NSImageHintInterpolation : @(NSImageInterpolationHigh) }];
            return YES;
        }];

參考自:
作者:悲觀患者
鏈接:http://www.itdecent.cn/p/4febaa8ee4fb
來源:簡(jiǎn)書
展示圖片通常是用NSImageView,然后設(shè)置它的image屬性。但是很多時(shí)候,圖片尺寸都不符合設(shè)計(jì)稿要求,這就需要進(jìn)行圖片裁剪了,
默認(rèn)情況下,NSImageView的高寬比并不能改變其中image的高寬比,只會(huì)讓它等比例縮放。當(dāng)然,直接設(shè)置image.size的width和height也是不行的。
行之有效的方法是,截取原圖中的一部分,并用drawInRect將其繪制到一個(gè)符合設(shè)計(jì)尺寸的rect中,形成一張新圖,代碼如下:

self.imageScaling = NSImageScaleAxesIndependently; // 高和寬各自縮放去適應(yīng)目標(biāo)區(qū)域,不保留原圖高寬比
    self.image = 
        [NSImage imageWithSize:self.bounds.size 
                                  flipped:NO // 不翻轉(zhuǎn)       
              drawingHandler:^BOOL(NSRect dstRect) { 
                  NSSize imageSize = [image size]; // 原圖尺寸 
                  NSSize imageViewSize = self.bounds.size; // imageView尺寸,暫時(shí)不明白為什么不用dstRect 
                  NSSize newImageSize = imageSize; // 初始化新圖尺寸 
                  CGFloat imageAspectRatio = imageSize.height / imageSize.width; // 原圖高寬比 
                  CGFloat imageViewAspectRatio = imageViewSize.height / imageViewSize.width; // imageView高寬比
                    // 相對(duì)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]; // 高質(zhì)量繪圖 
                  [image drawInRect:dstRect  // 這里暫時(shí)不明白為什么用dstRect 
                  fromRect:srcRect 
                  operation:NSCompositeCopy 
                  fraction:1.0 // 完全不透明 
              respectFlipped:YES 
                        hints:@{ NSImageHintInterpolation : @(NSImageInterpolationHigh) }]; 
                  return YES; 
              }];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容