工具JC专题iOS开发杂货铺

iOS 中压缩图片和截图

2016-05-17  本文已影响588人  天空中的球

一、图片的压缩

图片如何进行缩小处理呢,通常我们拿到原图后,不一定可以得到合适的大小图片,此时需要你对图片进行一定的压缩。

1、是 “压” 文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降
2、是 “缩” 文件的尺寸变小,也就是像素数减少。长宽尺寸变小,文件体积同样会减小。

这个 UIImageJPEGRepresentation(image, 0.0),是1的功能。
这个 [sourceImage drawInRect:CGRectMake(0,0,targetWidth, targetHeight)] 是2的功能。
方法一

NSData *imgData = UIImageJPEGRepresentation(image, 0.7);
// 0.99  ===》原图质量为0.4,并不是越小,质量越小
// 一般比较符合的压缩系数,0.6-0.8之间是比较合适的,具体压缩系数是看具体的要求。

备注点:

* UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数而UIImagePNGRepresentation只需要图片引用作为参数.
* UIImagePNGRepresentation(UIImage *image)要比UIImageJPEGRepresentation(UIImage* image, 1.0)返回的图片数据量大很多.
方法二
- (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;
}

两种方法相结合可以更有效解决这类型问题,特别是上传图片到服务器的时候,需要两者结合。

二、截图

先直接通过代码获取View的截图,然后再来保存图片。

//获得屏幕图像  
- (UIImage *)imageFromView: (UIView *) theView    
{  
    UIGraphicsBeginImageContext(theView.frame.size);  
    CGContextRef context = UIGraphicsGetCurrentContext();  
    [theView.layer renderInContext:context];  
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();  
    UIGraphicsEndImageContext();  
    return theImage;  
}  
 
//获得某个范围内的屏幕图像  
- (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: 一个区分 PNG 、JPG 格式的判断方法, 取出图片数据的第一个字节, 就可以判断出图片的真实类型:

//通过图片Data数据第一个字节 来获取图片扩展名
- (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;
}

参考备注
http://www.henishuo.com/ios-image-compressed/

上一篇下一篇

猜你喜欢

热点阅读