72_iOS干货38_UIView设置图片显示+UIButton的setImage和setBackgroundImage区别+UIImage的四类压缩方法+获取UIImage的存储空间

一,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;
}

猜你喜欢

转载自blog.csdn.net/a_horse/article/details/83306283