最近項(xiàng)目中涉及到一個(gè)裁剪圖片的功能出了問題颁井,而且是僅僅針對那特定的一張圖片有問題翅敌。我們的需求是:如果圖片不是正方形益涧,則以較短邊為邊長裁剪成正方形圖片颈畸。方法是之前寫好的僻弹,一直用著沒有問題忧吟,不知為什么現(xiàn)在這張圖片就是裁剪有問題浑塞,只裁剪了部分圖片眉抬。
這就奇怪了遭顶,跟了一下代碼發(fā)現(xiàn)代碼邏輯本身沒有問題啊喇聊,網(wǎng)上搜索了一下別人的寫法也是一樣芜飘,換成其他人的方法進(jìn)行裁剪务豺,發(fā)現(xiàn)問題是一樣的。那就證明不是方法本身有問題嗦明,應(yīng)該是這張圖片有問題笼沥。那到底是什么問題呢?跟了好幾次代碼發(fā)現(xiàn)設(shè)置的圖片大小也沒有問題啊娶牌,那為什么只裁剪了部分圖片奔浅?
嘗試:既然只裁剪了部分,那我試著把圖片大小等比例放大看看裁剪后的圖片是什么樣子诗良?結(jié)果發(fā)現(xiàn)圖片裁剪部分跟著擴(kuò)大了汹桦,雖然還是部分,但是這部分大了很多鉴裹。一下子就明白了原因所在舞骆,應(yīng)該是這張圖片被等比例縮放了钥弯。再次查看UIImage的scale是3,那問題就明了了督禽,這張?zhí)厥獾膱D片是一張3倍圖脆霎,平常我們裁剪的圖片是一倍圖,所以一倍圖的時(shí)候獲取圖片的size大小沒有問題赂蠢,是真實(shí)的圖片大小绪穆。當(dāng)裁剪的圖片是一張3倍圖或者2倍圖的時(shí)候,再獲取圖片的size就不是圖片本身的真實(shí)大小了虱岂。所以就出現(xiàn)了我遇到的這個(gè)問題玖院。
結(jié)論:獲取一張圖片的大小不是size(雖然大多數(shù)情況下是正確的),圖片的真實(shí)大小是image.size*image.scale第岖。
下面是正確的圖片裁剪方法难菌,供大家參考。
// 以圖片中心為中心蔑滓,以最小邊為邊長郊酒,裁剪正方形圖片
+(UIImage *)cropSquareImage:(UIImage *)image{
CGImageRef sourceImageRef = [image CGImage];//將UIImage轉(zhuǎn)換成CGImageRef
CGFloat _imageWidth = image.size.width * image.scale;
CGFloat _imageHeight = image.size.height * image.scale;
CGFloat _width = _imageWidth > _imageHeight ? _imageHeight : _imageWidth;
CGFloat _offsetX = (_imageWidth - _width) / 2;
CGFloat _offsetY = (_imageHeight - _width) / 2;
CGRect rect = CGRectMake(_offsetX, _offsetY, _width, _width);
CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);//按照給定的矩形區(qū)域進(jìn)行剪裁
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
return newImage;
}