最近項目中涉及到一個裁剪圖片的功能出了問題,而且是僅僅針對那特定的一張圖片有問題。我們的需求是:如果圖片不是正方形,則以較短邊為邊長裁剪成正方形圖片。方法是之前寫好的,一直用著沒有問題,不知為什么現(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倍圖,平常我們裁剪的圖片是一倍圖,所以一倍圖的時候獲取圖片的size大小沒有問題,是真實的圖片大小。當(dāng)裁剪的圖片是一張3倍圖或者2倍圖的時候,再獲取圖片的size就不是圖片本身的真實大小了。所以就出現(xiàn)了我遇到的這個問題。
結(jié)論:獲取一張圖片的大小不是size(雖然大多數(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;
}