iOS 中压缩图片和截图

作者: 天空中的球 | 来源:发表于2016-05-17 17:49 被阅读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/

    相关文章

      网友评论

        本文标题:iOS 中压缩图片和截图

        本文链接:https://www.haomeiwen.com/subject/mdlirttx.html