如何压缩UIImage?
问题描述:
我正在写一个iPhone应用程序来创建一个屏幕截图,并将它作为PNG或JPG格式邮件。如何压缩图像以减小文件大小?如何压缩UIImage?
这里是我的捕捉图像代码:
UIGraphicsBeginImageContext(containerView.frame.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// launch mail app
[self performSelector:@selector(sendImage:) withObject:viewImage afterDelay:0.5];
答
类似的问题是answered here on the Stack。唯一的区别是你使用UIImage,但这不应该阻碍你,我认为一般的方法仍然可以工作。你甚至可以编程设置压缩因子。
希望这会有所帮助!
答
#import "UIImage+Compress.h"
#define MAX_IMAGEPIX 200.0 // max pix 200.0px
#define MAX_IMAGEDATA_LEN 50000.0 // max data length 5K
@implementation UIImage (Compress)
- (UIImage *)compressedImage {
CGSize imageSize = self.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
if (width <= MAX_IMAGEPIX && height <= MAX_IMAGEPIX) {
// no need to compress.
return self;
}
if (width == 0 || height == 0) {
// void zero exception
return self;
}
UIImage *newImage = nil;
CGFloat widthFactor = MAX_IMAGEPIX/width;
CGFloat heightFactor = MAX_IMAGEPIX/height;
CGFloat scaleFactor = 0.0;
if (widthFactor > heightFactor)
scaleFactor = heightFactor; // scale to fit height
else
scaleFactor = widthFactor; // scale to fit width
CGFloat scaledWidth = width * scaleFactor;
CGFloat scaledHeight = height * scaleFactor;
CGSize targetSize = CGSizeMake(scaledWidth, scaledHeight);
UIGraphicsBeginImageContext(targetSize); // this will crop
CGRect thumbnailRect = CGRectZero;
thumbnailRect.size.width = scaledWidth;
thumbnailRect.size.height = scaledHeight;
[self drawInRect:thumbnailRect];
newImage = UIGraphicsGetImageFromCurrentImageContext();
//pop the context to get back to the default
UIGraphicsEndImageContext();
return newImage;
}
- (NSData *)compressedData:(CGFloat)compressionQuality {
assert(compressionQuality <= 1.0 && compressionQuality >= 0);
return UIImageJPEGRepresentation(self, compressionQuality);
}
- (CGFloat)compressionQuality {
NSData *data = UIImageJPEGRepresentation(self, 1.0);
NSUInteger dataLength = [data length];
if(dataLength > MAX_IMAGEDATA_LEN) {
return 1.0 - MAX_IMAGEDATA_LEN/dataLength;
} else {
return 1.0;
}
}
- (NSData *)compressedData {
CGFloat quality = [self compressionQuality];
return [self compressedData:quality];
}
@end
+0
你会考虑添加一些解释,让读者理解为什么它是对这个问题的答案吗? – 2013-07-17 18:43:22
谢谢布鲁斯。我想通了,我需要的是以下行包括我的电子邮件图像的脚本:NSData * data = UIImageJPEGRepresentation(imageView,0.90); – MDM 2012-02-28 20:23:25