我們假設(shè)要在截圖中的舉行圖片展示區(qū)顯示圖片,由于原圖片的寬高比例與圖片顯示窗口的寬高比例不一定相同,所以,直接將圖片扔進(jìn)去會改變圖片的寬高比例,展示效果不好。

三河ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
這時你可能想到設(shè)置UIImageView的屬性 _imageView.contentMode = UIViewContentModeCenter;? 設(shè)置該屬性后,我們會發(fā)現(xiàn)圖片的寬高比例確實正確了,但是窗口中只顯示了圖片的一部分,這說明圖片整體尺寸沒有壓縮,按照原圖進(jìn)行顯示了。怎樣才能達(dá)到既縮小圖片又不改變原來的寬高比例呢?
方法一:將圖片按照原來的寬高比例壓縮到與窗口合適的大小,然后在設(shè)置了_imageView.contentMode = UIViewContentModeCenter;? 這個屬性的UIImageView中展示壓縮后的圖片。
//壓縮圖片
- (UIImage *)image:(UIImage*)image scaledToSize:(CGSize)newSize
{
// 創(chuàng)建一個圖形上下文形象
UIGraphicsBeginImageContext(newSize);
// 告訴舊圖片畫在這個新的環(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)去,使其自動適應(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é)果表明方法二效果更好。
在項目中經(jīng)常遇到要上傳圖片,如果直接上傳,那么會上傳比較大的圖片,導(dǎo)致費流量,刷新時加載圖片時間過長,手機(jī)內(nèi)存占用率高等問題。
一、先來介紹下概念:
圖片的壓縮其實是倆概念,
1、是 “壓” 文件體積變小,但是像素數(shù)不變,長寬尺寸不變,那么質(zhì)量可能下降,
2、是 “縮” 文件的尺寸變小,也就是像素數(shù)減少。長寬尺寸變小,文件體積同樣會減小。
二、解決方法(以上傳頭像為例),先縮再壓:
2.1 矯正圖片方向(照片是有方向的,避免出現(xiàn)“倒立”的情況)
- (UIImage*)fixOrientation:(UIImage*)aImage {
// No-op if the orientation is already correct
if(aImage.imageOrientation==UIImageOrientationUp)
returnaImage;
// We need to calculate the proper transformation to make the image upright.
// We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
CGAffineTransformtransform =CGAffineTransformIdentity;
switch(aImage.imageOrientation) {
caseUIImageOrientationDown:
caseUIImageOrientationDownMirrored:
transform =CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
transform =CGAffineTransformRotate(transform,M_PI);
break;
caseUIImageOrientationLeft:
caseUIImageOrientationLeftMirrored:
transform =CGAffineTransformTranslate(transform, aImage.size.width,0);
transform =CGAffineTransformRotate(transform,M_PI_2);
break;
caseUIImageOrientationRight:
caseUIImageOrientationRightMirrored:
transform =CGAffineTransformTranslate(transform,0, aImage.size.height);
transform =CGAffineTransformRotate(transform, -M_PI_2);
break;
default:
break;
}
switch(aImage.imageOrientation) {
caseUIImageOrientationUpMirrored:
caseUIImageOrientationDownMirrored:
transform =CGAffineTransformTranslate(transform, aImage.size.width,0);
transform =CGAffineTransformScale(transform, -1,1);
break;
caseUIImageOrientationLeftMirrored:
caseUIImageOrientationRightMirrored:
transform =CGAffineTransformTranslate(transform, aImage.size.height,0);
transform =CGAffineTransformScale(transform, -1,1);
break;
default:
break;
}
// Now we draw the underlying CGImage into a new context, applying the transform
// calculated above.
CGContextRefctx =CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,
CGImageGetBitsPerComponent(aImage.CGImage),0,
CGImageGetColorSpace(aImage.CGImage),
CGImageGetBitmapInfo(aImage.CGImage));
CGContextConcatCTM(ctx, transform);
switch(aImage.imageOrientation) {
caseUIImageOrientationLeft:
caseUIImageOrientationLeftMirrored:
caseUIImageOrientationRight:
caseUIImageOrientationRightMirrored:
CGContextDrawImage(ctx,CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);
break;
default:
CGContextDrawImage(ctx,CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);
break;
}
CGImageRef cgimg =CGBitmapContextCreateImage(ctx);
UIImage *img = [UIImageimageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
return img;
}
2.2 拿到上面矯正過的圖片,縮小圖片尺寸,調(diào)用下面方法傳入newSize,如(200,200):
+ (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize
{
UIGraphicsBeginImageContext(newSize);
[imagedrawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage =UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
2.3 將2.2的圖片再壓,這個方法可以重復(fù)壓
//調(diào)整大小
NSData *imageData =UIImageJPEGRepresentation(newImage,rate);
NSUIntegersizeOrigin = [image Datalength];//多少KB
NSUIntegersizeOriginKB = sizeOrigin /1024;//多少KB
2.4 上傳頭像
調(diào)用后臺接口,把imageData二進(jìn)制數(shù)據(jù)上傳即可
總結(jié):對圖片壓縮處理時,在保證圖片清晰度變化不大時,減小圖片文件大小。方法2.2中的newSize 和 2.3中的rate要以實際效果來設(shè)置,我在自己項目中上傳的頭像最終尺寸是200*200像素,大小為4KB左右。
工作中遇到需要將圖片壓縮之后上傳的需求。經(jīng)過多方查詢資料,目前總結(jié)出來兩種方式總結(jié)一下備用。
UIImageJPEGRepresentation(image, compression)
這個方法可以將iPhone拍攝的照片壓縮到幾百Kb的極限值,到極限值之后不管compression這個參數(shù)多小,該函數(shù)返回的數(shù)據(jù)大小都不會再改變。也就是說這個方法的壓縮是有最小值的,得到的是jpg格式。
另外有一個方法UIImagePNGRepresentation(#UIImage * _Nonnull image#)這個方法得到的數(shù)據(jù)會比之前那個方法得到的數(shù)據(jù)占用空間更大。
為了達(dá)到壓縮的目的,這種方法是有損的,就是會降低圖片質(zhì)量。
這種方法的到的圖片,newSize越小質(zhì)量越差,但是得到的圖片占用內(nèi)存越小。設(shè)置多大的newSize自己斟酌決定。
綜合一下自己平常在開發(fā)中常用的就是,先使用第一種方法保持精度不變,compression選擇0.6或者0.7進(jìn)行第一次壓縮,然后再用第二種方法進(jìn)行尺寸壓縮,得到的就是我們最終想要的圖片。
當(dāng)前題目:ios開發(fā)圖片壓縮,Ios圖片壓縮
當(dāng)前鏈接:http://chinadenli.net/article4/dsidiie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、ChatGPT、電子商務(wù)、網(wǎng)站營銷、外貿(mào)網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)