图片压缩:
图片压缩通常有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