Deep Analysis UIImageJPEGRepresentation&UIImagePNGRepresentation

标签:

 ios中提供了将UIImage转换成NSData的方法

UIKIT_EXTERN NSData *UIImagePNGRepresentation(UIImage *image);                               // return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format
UIKIT_EXTERN NSData *UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality);  // return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)

其中UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality)提供了一个压缩比率的参数compressionQuality,但是实际体验确实compressionQuality并不能够按照设定好的数值,按比例压缩.

比如一张388kb的图片(jpg格式),通过UIImageJPEGRepresentation方法压缩

compressionQuality = 1.0 压缩后图片大小为979kb;

compressionQuality = 0.5 压缩后图片大小为506kb;

compressionQuality = 0.1 压缩后图片大小为188kb;

compressionQuality压缩系数,跟最后文件的大小并没有明显的关系,不同的图片呈现不同结果.

本人对图片存储格式不是很了解,但是图片颜色细节越单一,图片可压缩的比率会越高.

这就带来一个问题,究竟我们如何设置compressionQuality这个参数.我们如何保证图片的原始大小转成NSData.

如果图片是PNG格式, UIImageJPEGRepresentation压缩率会很高.如果想保证图片原有质量,就需要用到UIImagePNGRepresentation(UIImage *image).

 

问题1:如何获得图片的原始尺寸,发送原图?

发送图片的时候需要将图片转换成NSData,这时肯定会涉及到UIImageJPEGRepresentation&UIImagePNGRepresentation这两个方法.

如果是jpg的图片,如果用了UIImagePNGRepresentation方法,图片会变得很大.如果用UIImageJPEGRepresentation,又涉及到compressionQuality参数.

如果是png的图片,直接用UIImagePNGRepresentation方法.关键是如何判断图片是PNG格式.

解决方案:可以通过判断图片的格式选择合适转换方法,如果是PNG格式直接用UIImagePNGRepresentation方法,如果是其它格式建议选择用UIImageJPEGRepresentation方法,通过imagepicker获取的图片,可以获得图片的扩展属性,通过这个扩展属性可以判断图片的格式.因为UIImage无法判断源文件的图片格式.

 

问题2:如何有效的对图片进行压缩?

当使用UIImageJPEGRepresentation方法时,一定要注意compressionQuality参数的设置,设定合理的参数,既保证图片的压缩比率,又能保证图片的清晰度.

 

除了ios提供的UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality)方法,我们还可以通过对图片分辨率的修改,对图片进行压缩

图片大小剪裁:

-(UIImage *) imageCompressForWidth:(UIImage *)sourceImage targetWidth:(CGFloat)defineWidth
{
    CGSize imageSize = sourceImage.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;
    CGFloat targetWidth = defineWidth;
    CGFloat targetHeight = (targetWidth / width) * height;
    UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight));
    [sourceImage drawInRect:CGRectMake(0,0,targetWidth,  targetHeight)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

通过降低图片分辨率的方法,可以极大减小图片的文件大小.

 

相册ImagePicker获取Image的两种方式: 

UIImagePickerControllerOriginalImage:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
        UIImage *orgImage = info[UIImagePickerControllerOriginalImage];
        [picker dismissViewControllerAnimated:YES completion:NULL];
}

UIImagePickerControllerReferenceURL:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
            [library assetForURL:[info objectForKey:UIImagePickerControllerReferenceURL]
                     resultBlock:^(ALAsset *asset)
             {
                 ALAssetRepresentation *representation = [asset defaultRepresentation];
                 CGImageRef imgRef = [representation fullResolutionImage];
                 UIImage *image = [UIImage imageWithCGImage:imgRef
                                                    scale:representation.scale
                                              orientation:(UIImageOrientation)representation.orientation];
                 NSData * data = UIImageJPEGRepresentation(image, 0.5);                

             }failureBlock:^(NSError *error){
                 NSLog(@"couldn‘t get asset: %@", error);
             }
             ];
}

 

Deep Analysis UIImageJPEGRepresentation&UIImagePNGRepresentation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值