最近在改的需求,需要裁剪圖片,然后網(wǎng)上各種搜索,終于尋得一個仿微信頭像裁剪的demo,改一改基本OK。但是第一次裁剪完的圖片有些模糊,網(wǎng)上看帖子,有人提議把UIGraphicsBeginImageContext(size);這行代碼改成如下形式:UIGraphicsBeginImageContextWithOptions(size,NO,kDeviceScale);這樣的話,加了屏幕分辨率,縮放以后準備裁剪的圖片確實不模糊了,但是誕生了一個新的問題,明明圖片已經調整到裁剪框的中心也縮放到了想要的內容范圍,但是裁剪以后的結果是只有圖片右上角的1/4,好苦逼啊,然后又是各種嘗試,各種問大神,最后又是分辨率的問題,擦,想死的節(jié)奏!記錄一下給需要用到裁剪功能的同學提個醒,與及給正在為此問題煩惱的同學予希望之光。
- (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);
//設置圖片的分辨率,保證圖片的清晰度(kDeviceScale)
UIGraphicsBeginImageContextWithOptions(size,NO,kDeviceScale);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, myImageRect, subImageRef);
UIImage *smallImage = [UIImage imageWithCGImage:subImageRef];
CGImageRelease(subImageRef);
UIGraphicsEndImageContext();
return smallImage;
}