一、圖片的壓縮
圖片如何進(jìn)行縮小處理呢音诈,通常我們拿到原圖后幻碱,不一定可以得到合適的大小圖片绎狭,此時(shí)需要你對圖片進(jìn)行一定的壓縮。
1褥傍、是 “壓” 文件體積變小儡嘶,但是像素?cái)?shù)不變,長寬尺寸不變恍风,那么質(zhì)量可能下降
2蹦狂、是 “縮” 文件的尺寸變小,也就是像素?cái)?shù)減少朋贬。長寬尺寸變小凯楔,文件體積同樣會減小。
這個(gè) UIImageJPEGRepresentation(image, 0.0)兄世,是1的功能啼辣。
這個(gè) [sourceImage drawInRect:CGRectMake(0,0,targetWidth, targetHeight)] 是2的功能。
方法一
NSData *imgData = UIImageJPEGRepresentation(image, 0.7);
// 0.99 ===》原圖質(zhì)量為0.4御滩,并不是越小鸥拧,質(zhì)量越小
// 一般比較符合的壓縮系數(shù),0.6-0.8之間是比較合適的削解,具體壓縮系數(shù)是看具體的要求富弦。
備注點(diǎn):
* UIImageJPEGRepresentation函數(shù)需要兩個(gè)參數(shù):圖片的引用和壓縮系數(shù)而UIImagePNGRepresentation只需要圖片引用作為參數(shù).
* UIImagePNGRepresentation(UIImage *image)要比UIImageJPEGRepresentation(UIImage* image, 1.0)返回的圖片數(shù)據(jù)量大很多.
方法二
- (UIImage *)compressImage:(UIImage *)sourceImage toTargetWidth:(CGFloat)targetWidth {
CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
CGFloat targetHeight = (targetWidth / width) * height;
UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight));
[sourceImage drawInRect:CGRectMake(0, 0, targetWidth, targetHeight)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
兩種方法相結(jié)合可以更有效解決這類型問題,特別是上傳圖片到服務(wù)器的時(shí)候氛驮,需要兩者結(jié)合腕柜。
二、截圖
先直接通過代碼獲取View的截圖矫废,然后再來保存圖片盏缤。
//獲得屏幕圖像
- (UIImage *)imageFromView: (UIView *) theView
{
UIGraphicsBeginImageContext(theView.frame.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[theView.layer renderInContext:context];
UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return theImage;
}
//獲得某個(gè)范圍內(nèi)的屏幕圖像
- (UIImage *)imageFromView:(UIView *)theView atFrame:(CGRect)r
{
UIGraphicsBeginImageContext(theView.frame.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
UIRectClip(r);
[theView.layer renderInContext:context];
UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return theImage;
}
PS: 一個(gè)區(qū)分 PNG 、JPG 格式的判斷方法, 取出圖片數(shù)據(jù)的第一個(gè)字節(jié), 就可以判斷出圖片的真實(shí)類型:
//通過圖片Data數(shù)據(jù)第一個(gè)字節(jié) 來獲取圖片擴(kuò)展名
- (NSString *)contentTypeForImageData:(NSData *)data {
uint8_t c;
[data getBytes:&c length:1];
switch (c) {
case 0xFF:
return @"jpeg";
case 0x89:
return @"png";
case 0x47:
return @"gif";
case 0x49:
case 0x4D:
return @"tiff";
case 0x52:
if ([data length] < 12) {
return nil;
}
NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
return @"webp";
}
return nil;
}
return nil;
}