最近在改的需求恋追,需要裁剪圖片佳魔,然后網(wǎng)上各種搜索曙聂,終于尋得一個(gè)仿微信頭像裁剪的demo,改一改基本OK鞠鲜。但是第一次裁剪完的圖片有些模糊宁脊,網(wǎng)上看帖子,有人提議把UIGraphicsBeginImageContext(size);
這行代碼改成如下形式:UIGraphicsBeginImageContextWithOptions(size,NO,kDeviceScale);
這樣的話贤姆,加了屏幕分辨率榆苞,縮放以后準(zhǔn)備裁剪的圖片確實(shí)不模糊了,但是誕生了一個(gè)新的問(wèn)題霞捡,明明圖片已經(jīng)調(diào)整到裁剪框的中心也縮放到了想要的內(nèi)容范圍坐漏,但是裁剪以后的結(jié)果是只有圖片右上角的1/4,好苦逼啊,然后又是各種嘗試碧信,各種問(wèn)大神赊琳,最后又是分辨率的問(wèn)題,擦音婶,想死的節(jié)奏慨畸!記錄一下給需要用到裁剪功能的同學(xué)提個(gè)醒,與及給正在為此問(wèn)題煩惱的同學(xué)予希望之光衣式。
- (UIImage *)getSubImage {
CGRect squareFrame = self.cropFrame;
CGFloat scaleRatio = self.latestFrame.size.width / self.originalImage.size.width;
CGFloat x = (squareFrame.origin.x - self.latestFrame.origin.x) / scaleRatio;
CGFloat y = (squareFrame.origin.y - self.latestFrame.origin.y) / scaleRatio;
CGFloat w = squareFrame.size.width / scaleRatio;
CGFloat h = squareFrame.size.width / scaleRatio;
if (self.latestFrame.size.width < self.cropFrame.size.width) {
CGFloat newW = self.originalImage.size.width;
CGFloat newH = newW * (self.cropFrame.size.height / self.cropFrame.size.width);
x = 0; y = y + (h - newH) / 2;
w = newH; h = newH;
}
if (self.latestFrame.size.height < self.cropFrame.size.height) {
CGFloat newH = self.originalImage.size.height;
CGFloat newW = newH * (self.cropFrame.size.width / self.cropFrame.size.height);
x = x + (w - newW) / 2; y = 0;
w = newH; h = newH;
}
//乘以圖片的分辨率寸士,保證截到一張完整的圖(分辨率:kDeviceScale)
CGRect myImageRect = CGRectMake(x*kDeviceScale,y*kDeviceScale, w*kDeviceScale, h*kDeviceScale);
CGImageRef imageRef = self.originalImage.CGImage;
CGImageRef subImageRef = CGImageCreateWithImageInRect(imageRef, myImageRect);
CGSize size;
size.width = myImageRect.size.width;
size.height = myImageRect.size.height;
//UIGraphicsBeginImageContext(size);
//設(shè)置圖片的分辨率檐什,保證圖片的清晰度(kDeviceScale)
UIGraphicsBeginImageContextWithOptions(size,NO,kDeviceScale);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, myImageRect, subImageRef);
UIImage *smallImage = [UIImage imageWithCGImage:subImageRef];
CGImageRelease(subImageRef);
UIGraphicsEndImageContext();
return smallImage;
}