123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- //
- // UIImage+NTESm
- // NIM
- //
- // Created by chris on 15/7/13.
- // Copyright (c) 2015年 Netease. All rights reserved.
- //
- #import "UIImage+NTES.h"
- #import "NTESDevice.h"
- #define ChartletBundle @"NIMDemoChartlet.bundle"
- #define EmojiCatalog @"default"
- #define ChartletChartletCatalogContentPath @"content"
- #define ChartletChartletCatalogIconPath @"icon"
- #define ChartletChartletCatalogIconsSuffixNormal @"normal"
- #define ChartletChartletCatalogIconsSuffixHighLight @"highlighted"
- @implementation UIImage (NTES)
- + (UIImage *)fetchImage:(NSString *)imageNameOrPath{
- UIImage *image = [UIImage imageNamed:imageNameOrPath];
- if (!image) {
- image = [UIImage imageWithContentsOfFile:imageNameOrPath];
- }
- return image;
- }
- + (UIImage *)fetchChartlet:(NSString *)imageName chartletId:(NSString *)chartletId{
- if ([chartletId isEqualToString:EmojiCatalog]) {
- return [UIImage imageNamed:imageName];
- }
- NSString *bundlePath = [[NSBundle mainBundle] pathForResource:ChartletBundle ofType:nil];
- NSString *subDirectory = [NSString stringWithFormat:@"/%@/%@",chartletId,ChartletChartletCatalogContentPath];
- //先拿2倍图
- NSString *doubleImage = [imageName stringByAppendingString:@"@2x"];
- NSString *tribleImage = [imageName stringByAppendingString:@"@3x"];
- NSString *sourcePath = [bundlePath stringByAppendingPathComponent:subDirectory];
- NSString *path = nil;
-
- NSArray *array = [NSBundle pathsForResourcesOfType:nil inDirectory:sourcePath];
- NSString *fileExt = [[array.firstObject lastPathComponent] pathExtension];
- if ([UIScreen mainScreen].scale == 3.0) {
- path = [NSBundle pathForResource:tribleImage ofType:fileExt inDirectory:sourcePath];
- }
- path = path ? path : [NSBundle pathForResource:doubleImage ofType:fileExt inDirectory:sourcePath]; //取二倍图
- path = path ? path : [NSBundle pathForResource:imageName ofType:fileExt inDirectory:sourcePath]; //实在没了就去取一倍图
- return [UIImage imageWithContentsOfFile:path];
- }
- - (UIImage *)imageForAvatarUpload
- {
- CGFloat pixels = [[NTESDevice currentDevice] suggestImagePixels];
- UIImage * image = [self imageForUpload:pixels];
- return [image fixOrientation];
- }
- #pragma mark - Private
- - (UIImage *)imageForUpload: (CGFloat)suggestPixels
- {
- const CGFloat kMaxPixels = 4000000;
- const CGFloat kMaxRatio = 3;
-
- CGFloat width = self.size.width;
- CGFloat height= self.size.height;
-
- //对于超过建议像素,且长宽比超过max ratio的图做特殊处理
- if (width * height > suggestPixels &&
- (width / height > kMaxRatio || height / width > kMaxRatio))
- {
- return [self scaleWithMaxPixels:kMaxPixels];
- }
- else
- {
- return [self scaleWithMaxPixels:suggestPixels];
- }
- }
- - (UIImage *)scaleWithMaxPixels: (CGFloat)maxPixels
- {
- CGFloat width = self.size.width;
- CGFloat height= self.size.height;
- if (width * height < maxPixels || maxPixels == 0)
- {
- return self;
- }
- CGFloat ratio = sqrt(width * height / maxPixels);
- if (fabs(ratio - 1) <= 0.01)
- {
- return self;
- }
- CGFloat newSizeWidth = width / ratio;
- CGFloat newSizeHeight= height/ ratio;
- return [self scaleToSize:CGSizeMake(newSizeWidth, newSizeHeight)];
- }
- //内缩放,一条变等于最长边,另外一条小于等于最长边
- - (UIImage *)scaleToSize:(CGSize)newSize
- {
- CGFloat width = self.size.width;
- CGFloat height= self.size.height;
- CGFloat newSizeWidth = newSize.width;
- CGFloat newSizeHeight= newSize.height;
- if (width <= newSizeWidth &&
- height <= newSizeHeight)
- {
- return self;
- }
-
- if (width == 0 || height == 0 || newSizeHeight == 0 || newSizeWidth == 0)
- {
- return nil;
- }
- CGSize size;
- if (width / height > newSizeWidth / newSizeHeight)
- {
- size = CGSizeMake(newSizeWidth, newSizeWidth * height / width);
- }
- else
- {
- size = CGSizeMake(newSizeHeight * width / height, newSizeHeight);
- }
- return [self drawImageWithSize:size];
- }
- - (UIImage *)drawImageWithSize: (CGSize)size
- {
- CGSize drawSize = CGSizeMake(floor(size.width), floor(size.height));
- // 传入的View.frame.size是0的话,直接返回nil,防止 UIGraphicsBeginImageContext() 传入0,导致崩溃
- if (CGSizeEqualToSize(size, CGSizeZero)) {
- return nil;
- }
- UIGraphicsBeginImageContext(drawSize);
-
- [self drawInRect:CGRectMake(0, 0, drawSize.width, drawSize.height)];
- UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return newImage;
- }
- - (UIImage *)fixOrientation
- {
-
- // No-op if the orientation is already correct
- if (self.imageOrientation == UIImageOrientationUp)
- return self;
-
- // We need to calculate the proper transformation to make the image upright.
- // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
- CGAffineTransform transform = CGAffineTransformIdentity;
-
- switch (self.imageOrientation) {
- case UIImageOrientationDown:
- case UIImageOrientationDownMirrored:
- transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height);
- transform = CGAffineTransformRotate(transform, M_PI);
- break;
-
- case UIImageOrientationLeft:
- case UIImageOrientationLeftMirrored:
- transform = CGAffineTransformTranslate(transform, self.size.width, 0);
- transform = CGAffineTransformRotate(transform, M_PI_2);
- break;
-
- case UIImageOrientationRight:
- case UIImageOrientationRightMirrored:
- transform = CGAffineTransformTranslate(transform, 0, self.size.height);
- transform = CGAffineTransformRotate(transform, -M_PI_2);
- break;
- default:
- break;
- }
-
- switch (self.imageOrientation) {
- case UIImageOrientationUpMirrored:
- case UIImageOrientationDownMirrored:
- transform = CGAffineTransformTranslate(transform, self.size.width, 0);
- transform = CGAffineTransformScale(transform, -1, 1);
- break;
-
- case UIImageOrientationLeftMirrored:
- case UIImageOrientationRightMirrored:
- transform = CGAffineTransformTranslate(transform, self.size.height, 0);
- transform = CGAffineTransformScale(transform, -1, 1);
- break;
- default:
- break;
- }
-
- // Now we draw the underlying CGImage into a new context, applying the transform
- // calculated above.
- CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height,
- CGImageGetBitsPerComponent(self.CGImage), 0,
- CGImageGetColorSpace(self.CGImage),
- CGImageGetBitmapInfo(self.CGImage));
- CGContextConcatCTM(ctx, transform);
- switch (self.imageOrientation) {
- case UIImageOrientationLeft:
- case UIImageOrientationLeftMirrored:
- case UIImageOrientationRight:
- case UIImageOrientationRightMirrored:
- // Grr...
- CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage);
- break;
-
- default:
- CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage);
- break;
- }
-
- // And now we just create a new UIImage from the drawing context
- CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
- UIImage *img = [UIImage imageWithCGImage:cgimg];
- CGContextRelease(ctx);
- CGImageRelease(cgimg);
- return img;
- }
- @end
|