iOS正確裁剪圖片的方法

最近項目中涉及到一個裁剪圖片的功能出了問題,而且是僅僅針對那特定的一張圖片有問題。我們的需求是:如果圖片不是正方形,則以較短邊為邊長裁剪成正方形圖片。方法是之前寫好的,一直用著沒有問題,不知為什么現(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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容