一,UIView设置图片显示
//view的背景显示图片
view.layer.contents = (__bridge id)(image.CGImage);
view.layer.backgroundColor = [UIColor clearColor].CGColor;
二,UIButton的setImage和setBackgroundImage区别
- 1,setBackgroundImage,图片会随着按钮的大小而改变,图片自动会拉伸来适应按钮的大小,这个时候任然可以设置按钮的title,图片不会挡住title;
- 2,setImage,此时再设置title,title将无法显示。图片不会随着按钮的大小改变而改变。
三,UIImage的三类压缩方法
- 1,图片剪切
-
//1,图片剪切:剪切长方形图片中间正方形部分 - (UIImage *)cutToCenterImage { CGSize imageSize = self.size; // 中间最大正方形尺寸 CGRect centerRect; CGFloat centerRectWH; //根据图片的大小计算出图片中间矩形区域的位置与大小,一定要乘以self.scale if (imageSize.width > imageSize.height) { centerRectWH = imageSize.height * self.scale; float leftMargin = (imageSize.width - imageSize.height) * 0.5; centerRect = CGRectMake(leftMargin,0,centerRectWH,centerRectWH); }else{ centerRectWH = imageSize.width * self.scale; float topMargin = (imageSize.height - imageSize.width)*0.5; centerRect = CGRectMake(0,topMargin,centerRectWH,centerRectWH); } CGImageRef imageRef = self.CGImage; //在最大正方形尺寸范围内截取 CGImageRef imageRefRect = CGImageCreateWithImageInRect(imageRef, centerRect); UIImage *tmp = [UIImage imageWithCGImage:imageRefRect]; CGImageRelease(imageRefRect); return tmp; }
- 2,图片尺寸压缩
-
#pragma mark - 2,尺寸压缩: //1,压缩至指定尺寸 -(UIImage*)scaleImageToSize:(CGSize)newSize { UIGraphicsBeginImageContextWithOptions(newSize, YES, [UIScreen mainScreen].scale); // 绘制改变大小的图片 [self drawInRect:CGRectMake(0,0, newSize.width, newSize.height)]; // 从当前context中创建一个改变大小后的图片 UIImage* scaledImage =UIGraphicsGetImageFromCurrentImageContext(); // 使当前的context出堆栈 UIGraphicsEndImageContext(); //返回新的改变大小后的图片 return scaledImage; } //2,压缩至比例尺寸 - (UIImage *)scaleImageToScale:(CGFloat)scaleSize { UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.size.width * scaleSize, self.size.height * scaleSize), YES, [UIScreen mainScreen].scale); [self drawInRect:CGRectMake(0, 0, self.size.width * scaleSize, self.size.height * scaleSize)]; UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return scaledImage; } //3,压缩至指定宽度 - (UIImage *)scaleImageToWidth:(CGFloat)width{ // 如果传入的宽度比当前宽度还要大,就直接返回 if (width > self.size.width) { return self; } // 计算缩放之后的高度 CGFloat height = (width / self.size.width) * self.size.height; // 初始化要画的大小 CGRect rect = CGRectMake(0, 0, width, height); // 1. 开启图形上下文 // UIGraphicsBeginImageContext(rect.size); UIGraphicsBeginImageContextWithOptions(rect.size, YES, [UIScreen mainScreen].scale); // 2. 画到上下文中 (会把当前image里面的所有内容都画到上下文) [self drawInRect:rect]; // 3. 取到图片 UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); // 4. 关闭上下文 UIGraphicsEndImageContext(); // 5. 返回 return image; } //4,压缩至指定高度 - (UIImage *)scaleImageToHeight:(CGFloat)height{ // 如果传入的宽度比当前宽度还要大,就直接返回 if (height > self.size.height) { return self; } // 计算缩放之后的宽度 CGFloat width = (height / self.size.height) * self.size.width; // 初始化要画的大小 CGRect rect = CGRectMake(0, 0, width, height); // 1. 开启图形上下文 // UIGraphicsBeginImageContext(rect.size); UIGraphicsBeginImageContextWithOptions(rect.size, YES, [UIScreen mainScreen].scale); // 2. 画到上下文中 (会把当前image里面的所有内容都画到上下文) [self drawInRect:rect]; // 3. 取到图片 UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); // 4. 关闭上下文 UIGraphicsEndImageContext(); // 5. 返回 return image; }
- 3,图片存储空间压缩
#pragma mark - 3,图片质量压缩
- (UIImage *)qualityToMaxLength:(NSInteger)maxBytes {
CGFloat compression = 1;
NSData *data = UIImageJPEGRepresentation(self, compression);
if (data.length < maxBytes) return [UIImage imageWithData:data];
/*当图片大小小于 maxLength,大于 maxLength * 0.9 时,不再继续压缩。
最多压缩 6 次,1/(2^6) = 0.015625 < 0.02,
也能达到每次循环 compression减小 0.02 的效果
while (data.length > maxLength && compression > 0) {
compression -= 0.02;
data = UIImageJPEGRepresentation(self, compression);
}
*/
// 二分法优化
CGFloat max = 1;
CGFloat min = 0;
for (int i = 0; i < 6; ++i) {
compression = (max + min) / 2;
data = UIImageJPEGRepresentation(self, compression);
if (data.length < maxBytes * 0.9) {
min = compression;
} else if (data.length > maxBytes) {
max = compression;
} else {
break;
}
}
return [UIImage imageWithData:data];
}
- 4,先压缩尺寸,再压缩空间
#pragma mark - 4,最大尺寸和压缩质量,保证空间大小
- (UIImage *)compressToSize:(CGSize )targetSize maxBytes:(CGFloat)maxKBytes {
//先压缩尺寸
UIImage *equalImage = [self scaleImageToSize:targetSize];
if ([equalImage imageDataWithKB] <= maxKBytes) {
return equalImage;
}else {
//后压缩质量
return [equalImage qualityToMaxLength:maxKBytes * 1000];
};
}
- 5,获取image的存储空间
#pragma mark - 获取图片空间的大小,多少KB
- (CGFloat )imageDataWithKB{
NSData *data = UIImageJPEGRepresentation(self, 1.0);
CGFloat imageMemory = data.length / 1000.0;
return imageMemory;
}
#pragma mark - 获取图片空间的大小,多少MB
- (CGFloat )imageDataWithMB{
NSData *data = UIImageJPEGRepresentation(self, 1.0);
CGFloat imageMemory = data.length / 1000.0 /1000.0;
return imageMemory;
}