| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- //
- // UIImage+RedAnt.m
- // Apex And Drivers
- //
- // Created by Jack on 2018/8/29.
- // Copyright © 2018年 USAI. All rights reserved.
- //
- #import "UIImage+RedAnt.h"
- #import <CommonCrypto/CommonCrypto.h>
- static dispatch_semaphore_t _lock;
- #define Lock() dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER)
- #define Unlock() dispatch_semaphore_signal(_lock)
- @implementation UIImage (RedAnt)
- + (void)load {
- _lock = dispatch_semaphore_create(1);
- }
- + (instancetype)ra_imageWithURL:(NSURL *)url {
-
- if (url == nil) {
- return nil;
- }
-
- if ([url.scheme isEqualToString:@"file"]) {
- return [UIImage imageWithContentsOfFile:url.absoluteString];
- }
-
- NSString *md5 = [self md5:url.absoluteString];
-
- NSString *imgDir = [self imageCacheDir];
- NSString *imgPath = [imgDir stringByAppendingPathComponent:md5];
-
- NSFileManager *fileManager = [NSFileManager defaultManager];
-
- BOOL isDir = NO;
- BOOL exist = [fileManager fileExistsAtPath:imgPath isDirectory:&isDir];
-
- if (exist && !isDir) {
- return [UIImage imageWithContentsOfFile:imgPath];
- } else {
-
- NSData *imgData = [NSData dataWithContentsOfURL:url];
-
- exist = [fileManager fileExistsAtPath:imgDir isDirectory:&isDir];
- if ((exist && isDir) || !exist) {
- [fileManager createDirectoryAtPath:imgDir withIntermediateDirectories:YES attributes:nil error:nil];
- }
-
- UIImage *img = [UIImage imageWithData:imgData];
- if (img) { // 解析图片成功
- Lock();
- if (![fileManager fileExistsAtPath:imgPath]) {
- [imgData writeToFile:imgPath atomically:NO];
- }
- Unlock();
-
- return img;
- } else {
- return nil;
- }
- }
- }
- + (NSString *)imageCacheDir {
- return [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"ImageCache"];
- }
- + (NSString *)imageCachePath:(NSString *)url {
-
- NSString *md5 = [self md5:url];
-
- NSString *imgDir = [self imageCacheDir];
- NSString *imgPath = [imgDir stringByAppendingPathComponent:md5];
-
- return imgPath;
- }
- + (nullable NSString *)md5:(nullable NSString *)str {
- if (!str) return nil;
-
- const char *cStr = str.UTF8String;
- unsigned char result[CC_MD5_DIGEST_LENGTH];
- CC_MD5(cStr, (CC_LONG)strlen(cStr), result);
-
- NSMutableString *md5Str = [NSMutableString string];
- for (int i = 0; i < CC_MD5_DIGEST_LENGTH; ++i) {
- [md5Str appendFormat:@"%02x", result[i]];
- }
- return md5Str;
- }
- + (UIImage *)img_compress:(UIImage*)image kbsize:(float) size {
-
-
-
- //UIImage *image=[UIImage imageNamed:@"xxoo.jpeg"];
- NSData *imageData=UIImageJPEGRepresentation(image, 1.f);
-
- if(size>imageData.length/1024)
- return image;
-
- // CGFloat size=40.f;// kb
- CGFloat scale=size/(imageData.length/1024);
-
- scale = sqrt (scale);
-
- CGSize newsize=image.size;
- newsize.height = newsize.height*scale;
- newsize.width = newsize.width*scale;
-
- return [self scaleImageToSize:image size:newsize];
- }
- + (UIImage *)scaleImageToSize:(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();
- // 返回新的改变大小后的图片
-
- // NSData *imageData=UIImageJPEGRepresentation(scaledImage, 1.f);
- return scaledImage;
- }
- - (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
|