美文网首页iOS学习包iOS 开发 iOS
iOS开发探索-图片压缩处理

iOS开发探索-图片压缩处理

作者: 零距离仰望星空 | 来源:发表于2016-02-21 14:12 被阅读3210次
介绍:

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

应用:

在实际开发中,我们经常会对图片进行处理,满足开发需求,以下介绍三种图片压缩处理:

1.压缩图片质量(图片体积减小,像素不变)

两种读取图片数据的简单方法:
(1).UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数,压缩体积不是随压缩系数比例变化的。
(2).UIImagePNGRepresentation只需要图片引用作为参数。
注意:
UIImagePNGRepresentation(image) 要比UIImageJPEGRepresentation(image, 1.0) 返回的图片数据量大很多
建议优先使用 UIImageJPEGRepresentation ,并可根据自己的实际使用场景,设置压缩系数,进一步降低图片数据量大小。

+(UIImage *)reduceImage:(UIImage *)image percent:(float)percent
{
   NSData *imageData = UIImageJPEGRepresentation(image, percent);
   UIImage *newImage = [UIImage imageWithData:imageData];
   return newImage;
}

2.图片压缩到指定尺寸
+ (UIImage *) scaleImage:(UIImage *) image withNewSize:(CGSize) newSize
{
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}

3.压缩到指定尺寸等比例压缩

 -(UIImage *) imageCompressForSize:(UIImage *)sourceImage targetSize:(CGSize)size{
    UIImage *newImage = nil;
    CGSize imageSize = sourceImage.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;
    CGFloat targetWidth = size.width;
    CGFloat targetHeight = size.height;
    CGFloat scaleFactor = 0.0;
    CGFloat scaledWidth = targetWidth;
    CGFloat scaledHeight = targetHeight;
    CGPoint thumbnailPoint = CGPointMake(0.0, 0.0);
    if(CGSizeEqualToSize(imageSize, size) == NO){
        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;
        if(widthFactor > heightFactor){
            scaleFactor = widthFactor;
        }
        else{
            scaleFactor = heightFactor;
        }
        scaledWidth = width * scaleFactor;
        scaledHeight = height * scaleFactor;
        if(widthFactor > heightFactor){
            thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
        }else if(widthFactor < heightFactor){
        thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
        }
    }

    UIGraphicsBeginImageContext(size);
    CGRect thumbnailRect = CGRectZero;
    thumbnailRect.origin = thumbnailPoint;
    thumbnailRect.size.width = scaledWidth;
    thumbnailRect.size.height = scaledHeight;
    [sourceImage drawInRect:thumbnailRect];
    newImage = UIGraphicsGetImageFromCurrentImageContext();

    if(newImage == nil){
        NSLog(@"scale image fail");
   }
    UIGraphicsEndImageContext();
    return newImage;
}

-(UIImage *) imageCompressForWidth:(UIImage *)sourceImage targetWidth:(CGFloat)defineWidth
{
    UIImage *newImage = nil;
    CGSize imageSize = sourceImage.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;
    CGFloat targetWidth = defineWidth;
    CGFloat targetHeight = height / (width / targetWidth);
    CGSize size = CGSizeMake(targetWidth, targetHeight);
    CGFloat scaleFactor = 0.0;
    CGFloat scaledWidth = targetWidth;
    CGFloat scaledHeight = targetHeight;
    CGPoint thumbnailPoint = CGPointMake(0.0, 0.0);
    if(CGSizeEqualToSize(imageSize, size) == NO){
        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;
    if(widthFactor > heightFactor){
        scaleFactor = widthFactor;
    }
    else{
        scaleFactor = heightFactor;
    }
    scaledWidth = width * scaleFactor;
    scaledHeight = height * scaleFactor;
    if(widthFactor > heightFactor){
        thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
     }else if(widthFactor < heightFactor){
        thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
        }
    }
    UIGraphicsBeginImageContext(size);
    CGRect thumbnailRect = CGRectZero;
    thumbnailRect.origin = thumbnailPoint;
    thumbnailRect.size.width = scaledWidth;
    thumbnailRect.size.height = scaledHeight;

    [sourceImage drawInRect:thumbnailRect];

    newImage = UIGraphicsGetImageFromCurrentImageContext();
    if(newImage == nil){
       NSLog(@"scale image fail");
    }
    UIGraphicsEndImageContext();
    return newImage;
}

链接分享:http://www.tuicool.com/articles/VFB3Yzj

在此感谢各位读者的来访,您的关注是我写作分享的最大动力。

相关文章

  • iOS开发探索-图片压缩处理

    介绍: 压: 指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降。缩: 指文件的尺寸变小,也就是像素数...

  • iOS 图片压缩方法

    iOS 图片压缩方法 更多图片处理方法见图片组件 BBWebImage iOS 图片压缩方法 两种图片压缩方法 两...

  • imageView的处理

    图片的处理参见谈谈 iOS 中图片的解压缩

  • iOS-图片解压缩相关

    SDWebimage中对图片的解压缩 谈谈 iOS 中图片的解压缩 iOS 开发:绘制像素到屏幕 探讨iOS 中图...

  • ios图片压缩处理

    平时开发中图片的压缩处理一般包括所占内存大小的处理和尺寸的处理,内存方面的处理通常直接调用UIImageJPEGR...

  • iOS 图片压缩处理

    1、确图片的压缩的概念: “压” 是指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降。“缩” 是指文...

  • iOS 图片压缩处理

    1、确图片的压缩的概念: “压” 是指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降。“缩” 是指文...

  • iOS图片压缩处理

    首先,我们必须明确图片的压缩其实是两个概念: “压” 是指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能...

  • iOS 图片压缩处理

    由于图片加载如果图片内存太大的话第一次下载比较耗时,尤其是现在智能手机拍出的照片清晰度越来越高,内存越来越大,所以...

  • iOS 图片上传处理 图片压缩 图片处理

    提到从摄像头/相册获取图片是面向终端用户的,由用户去浏览并选择图片为程序使用。在这里,我们需要过UIImagePi...

网友评论

  • 随心_追梦:大神,压缩到指定大小,比如两兆,是如何处理的?
    零距离仰望星空:@随心_追梦 你先压缩一次 看图片大小是否小于2M 如果大于2M 继续压缩
    零距离仰望星空:@随心_追梦 通常是压缩后读取图片大小 过大继续压缩

本文标题:iOS开发探索-图片压缩处理

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