UIImage的等比例压缩和缩放实现

可以用延展为UIImage扩展以下方法,方便项目中以后的使用

  • 等比例压缩图片
.h
/**
 *  等比例压缩图片
 *
 *  @param sourceImage 原图
 *  @param size        压缩比例
 *
 *  @return
 */
+(UIImage *) imageCompressForSize:(UIImage *)sourceImage targetSize:(CGSize)size;
.m
//压缩图片(等比例)
+(UIImage *) imageCompressForSize:(UIImage *)sourceImage targetSize:(CGSize)size{
    UIImage *newImage = nil;
    CGSize imageSize = sourceImage.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;
    CGFloat targetWidth = size.width;
    CGFloat targetHeight = size.height;
    CGFloat scaleFactor = 0.0;
    CGFloat scaledWidth = targetWidth;
    CGFloat scaledHeight = targetHeight;
    CGPoint thumbnailPoint = CGPointMake(0.0, 0.0);
    if(CGSizeEqualToSize(imageSize, size) == NO){
        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;
        if(widthFactor > heightFactor){
            scaleFactor = widthFactor;
        }
        else{
            scaleFactor = heightFactor;
        }
        scaledWidth = width * scaleFactor;
        scaledHeight = height * scaleFactor;
        if(widthFactor > heightFactor){
            thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
        }else if(widthFactor < heightFactor){
            thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
        }
    }

    UIGraphicsBeginImageContext(size);

    CGRect thumbnailRect = CGRectZero;
    thumbnailRect.origin = thumbnailPoint;
    thumbnailRect.size.width = scaledWidth;
    thumbnailRect.size.height = scaledHeight;
    [sourceImage drawInRect:thumbnailRect];
    newImage = UIGraphicsGetImageFromCurrentImageContext();

    if(newImage == nil){
        NSLog(@"scale image fail");
    }

    UIGraphicsEndImageContext();

    return newImage;

}
  • 等比例缩放
.h
/**
 *  等比例缩放
 *
 *  @param image     需要缩放的图片
 *  @param scaleSize 缩放比例
 *
 *  @return 缩放后的图片
 */
+ (UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize;
.m
 - (UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize
{
    UIGraphicsBeginImageContext(CGSizeMake(image.size.width * scaleSize, image.size.height * scaleSize));
    [image drawInRect:CGRectMake(0, 0, image.size.width * scaleSize, image.size.height * scaleSize)];
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return scaledImage;
}
  • 图片等比例显示
.h
/**
 *  图片等比例显示
 *
 *  @param img 获取的图片
 *  @param imageView  显示图片的imageView
 *
 *  @return
 */
+(void)resizeFrameWithImg:(UIImage *)img andImageView:(UIImageView *)imageView;
.m
+(void)resizeFrameWithImg:(UIImage *)img andImageView:(UIImageView *)imageView
{
    //img的尺寸
    CGFloat imgWidth=img.size.width;
    CGFloat imgHeight=img.size.height;

    //imgView的尺寸
    CGFloat vWidth=imageView.frame.size.width;
    CGFloat vHeight=imageView.frame.size.height;

    //宽高比
    CGFloat dImg=imgWidth/imgHeight;
    CGFloat dView=vWidth/vHeight;

    if (dImg > dView) {
        CGFloat changedHeight=vWidth * (imgHeight/imgWidth);
        imageView.frame=CGRectMake(imageView.frame.origin.x, (vHeight-changedHeight)/2 + imageView.frame.origin.y, vWidth, changedHeight);
    }
    else
    {
        CGFloat changedWidth=vHeight * (imgWidth/imgHeight);
        imageView.frame=CGRectMake(imageView.frame.origin.x + (vWidth-changedWidth)/2, imageView.frame.origin.y, changedWidth, vHeight);
    }

}
  • 压缩图片
.h
/**
 *  压缩图片
 *
 *  @param img  压缩之前
 *  @param size 尺寸
 *
 *  @return 压缩后的
 */
+ (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size;
.m
+ (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size{

        // 创建一个bitmap的context

      // 并把它设置成为当前正在使用的context

        UIGraphicsBeginImageContext(size);

        // 绘制改变大小的图片

        [img drawInRect:CGRectMake(0,0, size.width, size.height)];

       // 从当前context中创建一个改变大小后的图片

        UIImage* scaledImage =UIGraphicsGetImageFromCurrentImageContext();

        // 使当前的context出堆栈

        UIGraphicsEndImageContext();

        //返回新的改变大小后的图片

        return scaledImage;

}

如果有什么不对的地方,望各位大神给出意见。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值