iOS 图片压缩与水印

图片压缩:

图片压缩通常有2类,第一类是尺寸上的压缩,第二类是质量月清晰度压缩。

图片水印:

图片水印主要是通过绘制实现的,包括文字水印和图片水印

#import "UMMediaUtils.h"
#import "NSString+Util.h"
#import "UMPThemeManager.h"


#define STHeitiSC_Medium @"STHeitiSC-Medium"

@implementation UMMediaUtils

/**
* @param  image 原图
* @targetSize 目标尺寸
*
* 这里的压缩和Android类似,尽可能保留最小尺寸,也不会导致图片变形
**/
+(UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)targetSize
{
    
    CGSize imageSize = image.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;
    CGFloat scaleFactor = 0.0;
    CGFloat widthFactor = targetSize.width / width;
    CGFloat heightFactor = targetSize.height / height;
    
    if (CGSizeEqualToSize(imageSize, targetSize) == NO)
    {
        if (widthFactor > heightFactor)
        {
           scaleFactor = widthFactor; // scale to fit height
        }
        else
        {
            scaleFactor = heightFactor; // scale to fit width
        }
    }else{
        scaleFactor = 1.0;
    }
    
    CGFloat scaledWidth= width * scaleFactor;
    CGFloat scaledHeight = height * scaleFactor;
    
    CGSize scaleSize = CGSizeMake(scaledWidth, scaledHeight);
    
    UIGraphicsBeginImageContext(scaleSize);
    CGContextRef context = UIGraphicsGetCurrentContext();

/**********************************************************/
    //这3行可以实现批量压缩的时候不至于出现OOM内存溢出,他的作用是把图片同样进行尺寸缩小
    CGAffineTransform transform = CGAffineTransformIdentity;
    transform = CGAffineTransformScale(transform,1,1);
    CGContextConcatCTM(context, transform);
/**********************************************************/
    [image drawInRect:CGRectMake(0, 0, scaleSize.width, scaleSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

/***
* 
*最简单的质量压缩,这里使用UIImageJPEGRepresentation,可以压缩png,jpeg,jpg等类型的图片
*
**/
+(NSData *) compressImage:(UIImage *)image  ratio:(CGFloat) compressRatio
{
    
    NSData * imageData = UIImageJPEGRepresentation(image,compressRatio);
    
    return imageData;

}
/***
* 
*这种属于质量趋近压缩算法,可以把尺寸尽量以最优的方式压缩到不大于目标值的范围
*
**/
+(NSData *) compressImage:(UIImage *)image qualityTo:(NSInteger )maxSize
{
    
    NSData * imageData = UIImageJPEGRepresentation(image,1.0);
    CGFloat sizeOriginKB = imageData.length / maxSize;
    NSLog(@"===>初始图片质量%fKB",sizeOriginKB);
    CGFloat resizeRate = 0.90;
    while (sizeOriginKB > maxSize && resizeRate > 0.1) {
        imageData = UIImageJPEGRepresentation(image,resizeRate);
        sizeOriginKB = imageData.length / maxSize;
        resizeRate -= 0.1;
    }
    
    NSLog(@"最终图片质量%fKB",sizeOriginKB);
    return imageData;
}

/**
**
*尺寸和质量同时压缩
**
*/
+(NSData *)scaleImage:(UIImage *)sourceImage  maxImageSize:(CGFloat)maxImageSize maxSizeWithKB:(CGFloat) maxSize
{
    
    if (maxSize <= 0.0) maxSize = 512.0f;
    if (maxImageSize <= 0.0) maxImageSize = 720.0f;
    
    maxImageSize = maxImageSize * 0.75;
    
    //先调整分辨率
    CGSize targetSize = CGSizeMake(sourceImage.size.width, sourceImage.size.height);
    NSLog(@"===>初始图片尺寸width=%f,height=%f",targetSize.width,targetSize.height);
    CGFloat tempHeight = targetSize.height / maxImageSize;
    CGFloat tempWidth = targetSize.width / maxImageSize;
    CGFloat scaleFactor = tempHeight>tempWidth?tempHeight:tempWidth;
    
    if (scaleFactor > 1.0 ) {
        targetSize = CGSizeMake(sourceImage.size.width / scaleFactor, sourceImage.size.height / scaleFactor);
    }
    //UIGraphicsBeginImageContext(targetSize);
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(targetSize.width, targetSize.height), NO, 1.0);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGAffineTransform transform = CGAffineTransformIdentity;
    
    transform = CGAffineTransformScale(transform,1,1);
    CGContextConcatCTM(context, transform);
    
    [sourceImage drawInRect:CGRectMake(0.0, 0.0, targetSize.width, targetSize.height)];

    
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    
    NSLog(@"最终图片尺寸width=%f,height=%f",targetSize.width,targetSize.height);
    
    //调整大小
    NSData * imageData = UIImageJPEGRepresentation(newImage,1.0);
    CGFloat sizeOriginKB = imageData.length / maxSize;
    NSLog(@"===>初始图片质量%fKB",sizeOriginKB);
    CGFloat resizeRate = 0.90;
    while (sizeOriginKB > maxSize && resizeRate > 0.1) {
        imageData = UIImageJPEGRepresentation(newImage,resizeRate);
        sizeOriginKB = imageData.length / maxSize;
        resizeRate -= 0.1;
    }
    
    NSLog(@"最终图片质量%fKB",sizeOriginKB);
    return imageData;
}


#pragma mark --加水印code  image:传入图片 datetime:时间(格式 yyyy/MM/dd HH:mm:ss)
+(UIImage *)waterMarkerForImage:(UIImage *) targetImage withImage:(NSString *)src widthText:(NSString *) text
{

    NSString *dateStr = text;
    CGSize size = targetImage.size;
    
    CGFloat logo_x = 20;
    CGFloat dateStr_x = size.width-210;
    UIFont *dateStrFont = [UIFont fontWithName:STHeitiSC_Medium size:(18)];
    if (size.width < 200) {
        logo_x = 5;
        dateStr_x = size.width-106;
        dateStrFont = [UIFont fontWithName:STHeitiSC_Medium size:(10)];
    }else if (size.width < 250) {
        logo_x = 5;
        dateStr_x = size.width-130;
        dateStrFont = [UIFont fontWithName:STHeitiSC_Medium size:(13)];
    }else if (size.width < 350){
        logo_x = 8;
        dateStr_x = size.width-160;
        dateStrFont = [UIFont fontWithName:STHeitiSC_Medium size:(15)];
    }
    
    UIGraphicsBeginImageContext(size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGAffineTransform transform = CGAffineTransformIdentity;
    
    transform = CGAffineTransformScale(transform,1,1);
    CGContextConcatCTM(context, transform);
    
    [targetImage drawInRect:CGRectMake(0.0, 0.0, size.width, size.height)];
    
    if(![NSString isEmptyOrNil:src])
    {
        BOOL isDir = NO;
        NSString  *waterLogo = nil;
        if([[NSFileManager defaultManager] fileExistsAtPath:src isDirectory:&isDir] && !isDir)
        {
            waterLogo = src;
        }else{
        
            waterLogo =  [[UMPThemeManager sharedUMPThemeManager] rebuildImgPath:src];
        }
        
     [[UIImage imageWithContentsOfFile:waterLogo] drawAtPoint:CGPointMake(logo_x, size.height-40)];
    }
    
    if(![NSString isEmptyOrNil:dateStr])
    {
        if ([dateStr respondsToSelector:@selector(drawAtPoint:withAttributes:)]) {
            
            [dateStr drawAtPoint:CGPointMake(dateStr_x+2, size.height-30) withAttributes:@{NSForegroundColorAttributeName:[UIColor blackColor],
                                                                                           NSFontAttributeName:dateStrFont}];
            [dateStr drawAtPoint:CGPointMake(dateStr_x, size.height-30) withAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
                                                                                         NSFontAttributeName:dateStrFont}];
            
        }else{
            NSAttributedString *attStr1 = [[NSAttributedString alloc] initWithString:dateStr attributes:@{NSForegroundColorAttributeName:[UIColor blackColor],
                                                                                                          NSFontAttributeName:dateStrFont}];
            [attStr1 drawAtPoint:CGPointMake(dateStr_x+2, size.height-30)];
            NSAttributedString *attStr = [[NSAttributedString alloc] initWithString:dateStr attributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
                                                                                                         NSFontAttributeName:dateStrFont}];
            [attStr drawAtPoint:CGPointMake(dateStr_x, size.height-30)];
        }
    }
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    
    return newImage;
    
}


@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值