变更记录
方案名称
UIImage - 获取 UIImage 大小与压缩 UIImage
关键字
UIImage \ 大小 \ 尺寸 \ 压缩
需求场景
- 需要对加载的 UIImage 进行压缩时
参考链接
- CSDN - UIImage 图片处理:截图,缩放,设定大小,存储
- Stack Overflow - iOS get UIImage memory size
详细内容
获取 UIImage 大小
1 2 3 4 5 6 7 8 9 10 11 12
| UIImage *testImage = [UIImage imageNamed:@"blue2.png"]; //877KB 600*600像素 NSUInteger s1 = UIImagePNGRepresentation(testImage).length; //992400
NSUInteger s2 = UIImageJPEGRepresentation(testImage, 1).length; //923162
NSUInteger s3 = CGImageGetHeight(testImage.CGImage) * CGImageGetBytesPerRow(testImage.CGImage); //1440000 = 600 * 600 * 4
//像素尺寸 CGFloat fixelW = CGImageGetWidth(testImage.CGImage);
CGFloat fixelH = CGImageGetHeight(testImage.CGImage);
|
测试文件大小为 877KB 600*600像素
其中 s1 为保存 PNG 格式文件最大内存占用大小
其中 s2 为保存 JPEG 格式文件最大内存占用大小
其中 s3 为该图片文件当前实际内存占用大小,与像素有关
从测试数据可见实际使用图片所占用内存大小往往大于图片实际大小,所以建议对较大图片进行压缩使用
压缩 UIImage
UIImage+Scale.h
1 2 3 4 5 6 7 8 9
| @interface UIImage (Scale)
//等比率缩放 - (UIImage *)scaleImageToScale:(float)scale;
//自定长宽 - (UIImage*)scaleImageToSize:(CGSize)size;
@end
|
UIImage+Scale.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #import "UIImage+Scale.h"
@implementation UIImage (Scale) //等比率缩放 - (UIImage *)scaleImageToScale:(float)scale { UIGraphicsBeginImageContext(CGSizeMake(self.size.width * scale, self.size.height * scale)); [self drawInRect:CGRectMake(0, 0, self.size.width * scale, self.size.height * scale)]; UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return scaledImage; }
//自定长宽 - (UIImage*)scaleImageToSize:(CGSize)size { UIGraphicsBeginImageContext(size); [self drawInRect:CGRectMake(0, 0, size.width, size.height)]; UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return scaledImage; }
@end
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *imagePhoto = [info objectForKey:UIImagePickerControllerOriginalImage];
NSData * imageData_before = UIImageJPEGRepresentation(imagePhoto,1); NSLog(@"Before : %d , %@",[imageData_before length]/1024,imagePhoto); imagePhoto = [imagePhoto scaleImageToSize:CGSizeMake(600, 600)]; NSData * imageData_after = UIImageJPEGRepresentation(imagePhoto,1); NSLog(@"After : %d , %@",[imageData_after length]/1024,imagePhoto); }
输出: Before : 1504 , <UIImage: 0x796561e0> size {2560, 1600} orientation 0 scale 1.000000 After : 341 , <UIImage: 0x78e4e2f0> size {600, 600} orientation 0 scale 1.000000
|
效果图
(无)
备注
(无)