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高寬比
// 相對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.reibang.com/p/4febaa8ee4fb
來源:簡書
展示圖片通常是用NSImageView,然后設(shè)置它的image屬性剿骨。但是很多時候,圖片尺寸都不符合設(shè)計(jì)稿要求亡笑,這就需要進(jìn)行圖片裁剪了脸狸,
默認(rèn)情況下,NSImageView的高寬比并不能改變其中image的高寬比缴渊,只會讓它等比例縮放赏壹。當(dāng)然,直接設(shè)置image.size的width和height也是不行的衔沼。
行之有效的方法是蝌借,截取原圖中的一部分,并用drawInRect將其繪制到一個符合設(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尺寸凝化,暫時不明白為什么不用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]; // 高質(zhì)量繪圖
[image drawInRect:dstRect // 這里暫時不明白為什么用dstRect
fromRect:srcRect
operation:NSCompositeCopy
fraction:1.0 // 完全不透明
respectFlipped:YES
hints:@{ NSImageHintInterpolation : @(NSImageInterpolationHigh) }];
return YES;
}];