我們假設(shè)要在截圖中的舉行圖片展示區(qū)顯示圖片,由于原圖片的寬高比例與圖片顯示窗口的寬高比例不一定相同,所以,直接將圖片扔進(jìn)去會(huì)改變圖片的寬高比例,展示效果不好。
這時(shí)你可能想到設(shè)置UIImageView的屬性 _imageView.contentMode = UIViewContentModeCenter;? 設(shè)置該屬性后,我們會(huì)發(fā)現(xiàn)圖片的寬高比例確實(shí)正確了,但是窗口中只顯示了圖片的一部分,這說(shuō)明圖片整體尺寸沒(méi)有壓縮,按照原圖進(jìn)行顯示了。怎樣才能達(dá)到既縮小圖片又不改變?cè)瓉?lái)的寬高比例呢?
方法一:將圖片按照原來(lái)的寬高比例壓縮到與窗口合適的大小,然后在設(shè)置了_imageView.contentMode = UIViewContentModeCenter;? 這個(gè)屬性的UIImageView中展示壓縮后的圖片。
//壓縮圖片
- (UIImage *)image:(UIImage*)image scaledToSize:(CGSize)newSize
{
// 創(chuàng)建一個(gè)圖形上下文形象
UIGraphicsBeginImageContext(newSize);
// 告訴舊圖片畫(huà)在這個(gè)新的環(huán)境,所需的
// 新的尺寸
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
// 新形象從上下文
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
// 結(jié)束上下文
UIGraphicsEndImageContext();
// 返回新形象
return newImage;
}
上面方法的參數(shù)newSize是和圖片顯示窗口差不多大的,結(jié)果出現(xiàn)了原圖清晰,但壓縮后圖片不清晰的情況。
方法二:按照窗口寬高比例,將原圖橫向或者縱向裁剪掉多余的部分,然后不設(shè)置UIImageView的contentMode屬性,將裁剪后的圖片送進(jìn)去,使其自動(dòng)適應(yīng)窗口。
//裁剪圖片
- (UIImage *)cutImage:(UIImage*)image
{
//壓縮圖片
CGSize newSize;
CGImageRef imageRef = nil;
if ((image.size.width / image.size.height) < (_headerView.bgImgView.size.width / _headerView.bgImgView.size.height)) {
newSize.width = image.size.width;
newSize.height = image.size.width * _headerView.bgImgView.size.height / _headerView.bgImgView.size.width;
imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(0, fabs(image.size.height - newSize.height) / 2, newSize.width, newSize.height));
} else {
newSize.height = image.size.height;
newSize.width = image.size.height * _headerView.bgImgView.size.width / _headerView.bgImgView.size.height;
imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(fabs(image.size.width - newSize.width) / 2, 0, newSize.width, newSize.height));
}
return [UIImage imageWithCGImage:imageRef];
}
結(jié)果表明方法二效果更好。