// // UIImage+RedAnt.m // Apex And Drivers // // Created by Jack on 2018/8/29. // Copyright © 2018年 USAI. All rights reserved. // #import "UIImage+RedAnt.h" #import 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; } 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; } // 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