123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702 |
- //
- // UIControl+acceptEventInterval.m
- // NXlib
- //
- // Created by AK on 15/9/15.
- // Copyright (c) 2015年 AK. All rights reserved.
- //
- #import "UIControl+NXCategory.h"
- #if TARGET_OS_IPHONE
- #import <objc/message.h>
- #import <objc/runtime.h>
- #else
- #import <objc/objc-class.h>
- #endif
- @implementation UIControl (NXCategory)
- static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";
- static const char *UIControl_ignoreEvent = "UIControl_ignoreEvent";
- //改变两个方法的实现。在类第一次使用的时候回调用这个方法
- + (void)load
- {
- Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
- Method b = class_getInstanceMethod(self, @selector(__uxy_sendAction:to:forEvent:));
- //改变两个方法的实现
- method_exchangeImplementations(a, b); // isnt
- }
- //通过关联对象重写get和set方法
- - (NSTimeInterval)uxy_acceptEventInterval
- {
- return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];
- }
- - (void)setUxy_acceptEventInterval:(NSTimeInterval)uxy_acceptEventInterval
- {
- objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(uxy_acceptEventInterval),
- OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- }
- #pragma mark 现在是否可点的get和set。通过关联对象。
- - (void)setIgnoreEvent:(BOOL)ignoreEvent
- {
- objc_setAssociatedObject(self, UIControl_ignoreEvent, @(ignoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- }
- - (BOOL)ignoreEvent { return [objc_getAssociatedObject(self, UIControl_ignoreEvent) boolValue]; }
- - (void)__uxy_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
- {
- if (self.ignoreEvent)
- {
- NSLog(@"无效点击!!!!!!!!!!");
- return;
- }
- if (self.uxy_acceptEventInterval > 0)
- {
- self.ignoreEvent = YES;
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.uxy_acceptEventInterval * NSEC_PER_SEC)),
- dispatch_get_main_queue(), ^{
- self.ignoreEvent = NO;
- });
- }
- //调用系统实现
- [self __uxy_sendAction:action to:target forEvent:event];
- }
- @end
- #import <Accelerate/Accelerate.h>
- @implementation UIImage (NXCategory)
- #pragma mark - blur 效果
- + (UIImage *)nx_blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur
- {
- CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];
- CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"
- keysAndValues:kCIInputImageKey, inputImage, @"inputRadius", @(blur), nil];
- CIImage *outputImage = filter.outputImage;
- CIContext *context = [CIContext contextWithOptions:nil];
- CGImageRef outImage = [context createCGImage:outputImage fromRect:[outputImage extent]];
- return [UIImage imageWithCGImage:outImage];
- }
- + (UIImage *)nx_boxblurImage:(UIImage *)toBlurImage
- {
- UIImage *newImage =
- [toBlurImage nx_scaleToSize:CGSizeMake(toBlurImage.size.width / 2., toBlurImage.size.height / 2.)];
- NSData *jpgData = UIImageJPEGRepresentation(newImage, 0.01);
- UIImage *image = [UIImage imageWithData:jpgData];
- CGFloat blur = 0.3f;
- int boxSize = (int)(blur * 40);
- boxSize = boxSize - (boxSize % 2) + 1;
- CGImageRef img = image.CGImage;
- vImage_Buffer inBuffer, outBuffer;
- vImage_Error error;
- void *pixelBuffer;
- // create vImage_Buffer with data from CGImageRef
- CGDataProviderRef inProvider = CGImageGetDataProvider(img);
- CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
- inBuffer.width = CGImageGetWidth(img);
- inBuffer.height = CGImageGetHeight(img);
- inBuffer.rowBytes = CGImageGetBytesPerRow(img);
- inBuffer.data = (void *)CFDataGetBytePtr(inBitmapData);
- // create vImage_Buffer for output
- pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
- if (pixelBuffer == NULL) NSLog(@"No pixelbuffer");
- outBuffer.data = pixelBuffer;
- outBuffer.width = CGImageGetWidth(img);
- outBuffer.height = CGImageGetHeight(img);
- outBuffer.rowBytes = CGImageGetBytesPerRow(img);
- // perform convolution
- error =
- vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend)
- ?: vImageBoxConvolve_ARGB8888(&outBuffer, &inBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend)
- ?: vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL,
- kvImageEdgeExtend);
- if (error)
- {
- NSLog(@"error from convolution %ld", error);
- }
- CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
- CGContextRef ctx = CGBitmapContextCreate(outBuffer.data, outBuffer.width, outBuffer.height, 8, outBuffer.rowBytes,
- colorSpace, (CGBitmapInfo)kCGImageAlphaNoneSkipLast);
- CGImageRef imageRef = CGBitmapContextCreateImage(ctx);
- UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
- // clean up
- CGContextRelease(ctx);
- CGColorSpaceRelease(colorSpace);
- free(pixelBuffer);
- CFRelease(inBitmapData);
- CGImageRelease(imageRef);
- return returnImage;
- }
- #pragma mark - 旋转
- + (UIImage *)nx_fixOrientation:(UIImage *)aImage isFront:(BOOL)isFront;
- {
- // No-op if the orientation is already correct
- if (aImage.imageOrientation == UIImageOrientationUp) return aImage;
- // 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;
- if (isFront)
- {
- transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
- transform = CGAffineTransformScale(transform, -1, 1);
- }
- switch (aImage.imageOrientation)
- {
- case UIImageOrientationDown:
- case UIImageOrientationDownMirrored:
- transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
- transform = CGAffineTransformRotate(transform, M_PI);
- break;
- case UIImageOrientationLeft:
- case UIImageOrientationLeftMirrored:
- transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
- transform = CGAffineTransformRotate(transform, M_PI_2);
- break;
- case UIImageOrientationRight:
- case UIImageOrientationRightMirrored:
- transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);
- transform = CGAffineTransformRotate(transform, -M_PI_2);
- break;
- default:
- break;
- }
- switch (aImage.imageOrientation)
- {
- case UIImageOrientationUpMirrored:
- case UIImageOrientationDownMirrored:
- transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
- transform = CGAffineTransformScale(transform, -1, 1);
- break;
- case UIImageOrientationLeftMirrored:
- case UIImageOrientationRightMirrored:
- transform = CGAffineTransformTranslate(transform, aImage.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, aImage.size.width, aImage.size.height, CGImageGetBitsPerComponent(aImage.CGImage),
- 0, CGImageGetColorSpace(aImage.CGImage), CGImageGetBitmapInfo(aImage.CGImage));
- CGContextConcatCTM(ctx, transform);
- switch (aImage.imageOrientation)
- {
- case UIImageOrientationLeft:
- case UIImageOrientationLeftMirrored:
- case UIImageOrientationRight:
- case UIImageOrientationRightMirrored:
- // Grr...
- CGContextDrawImage(ctx, CGRectMake(0, 0, aImage.size.height, aImage.size.width), aImage.CGImage);
- break;
- default:
- CGContextDrawImage(ctx, CGRectMake(0, 0, aImage.size.width, aImage.size.height), aImage.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;
- }
- // 旋转
- + (UIImage *)nx_rotationImage:(UIImage *)image orientation:(UIImageOrientation)orientation
- {
- long double rotate = 0.0;
- CGRect rect;
- float translateX = 0;
- float translateY = 0;
- float scaleX = 1.0;
- float scaleY = 1.0;
- switch (orientation)
- {
- case UIImageOrientationLeft:
- rotate = M_PI_2;
- rect = CGRectMake(0, 0, image.size.height, image.size.width);
- translateX = 0;
- translateY = -rect.size.width;
- scaleY = rect.size.width / rect.size.height;
- scaleX = rect.size.height / rect.size.width;
- break;
- case UIImageOrientationRight:
- rotate = 3 * M_PI_2;
- rect = CGRectMake(0, 0, image.size.height, image.size.width);
- translateX = -rect.size.height;
- translateY = 0;
- scaleY = rect.size.width / rect.size.height;
- scaleX = rect.size.height / rect.size.width;
- break;
- case UIImageOrientationDown:
- rotate = M_PI;
- rect = CGRectMake(0, 0, image.size.width, image.size.height);
- translateX = -rect.size.width;
- translateY = -rect.size.height;
- break;
- default:
- rotate = 0.0;
- rect = CGRectMake(0, 0, image.size.width, image.size.height);
- translateX = 0;
- translateY = 0;
- break;
- }
- UIGraphicsBeginImageContext(rect.size);
- CGContextRef context = UIGraphicsGetCurrentContext();
- //做CTM变换
- CGContextTranslateCTM(context, 0.0, rect.size.height);
- CGContextScaleCTM(context, 1.0, -1.0);
- CGContextRotateCTM(context, rotate);
- CGContextTranslateCTM(context, translateX, translateY);
- CGContextScaleCTM(context, scaleX, scaleY);
- //绘制图片
- CGContextDrawImage(context, CGRectMake(0, 0, rect.size.width, rect.size.height), image.CGImage);
- UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext();
- NSLog(@"image size %f---%f", image.size.width, image.size.height);
- UIGraphicsEndImageContext();
- return newPic;
- }
- #pragma mark - 缩放
- - (UIImage *)nx_scaleToSize:(CGSize)size
- {
- CGFloat width = CGImageGetWidth(self.CGImage);
- CGFloat height = CGImageGetHeight(self.CGImage);
- float verticalRadio = size.height * 1.0 / height;
- float horizontalRadio = size.width * 1.0 / width;
- float radio = 1;
- if (verticalRadio > 1 && horizontalRadio > 1)
- {
- radio = verticalRadio > horizontalRadio ? horizontalRadio : verticalRadio;
- }
- else
- {
- radio = verticalRadio < horizontalRadio ? verticalRadio : horizontalRadio;
- }
- width = width * radio;
- height = height * radio;
- int xPos = (size.width - width) / 2;
- int yPos = (size.height - height) / 2;
- // 创建一个bitmap的context
- // 并把它设置成为当前正在使用的context
- UIGraphicsBeginImageContext(size);
- // 绘制改变大小的图片
- [self drawInRect:CGRectMake(xPos, yPos, width, height)];
- // 从当前context中创建一个改变大小后的图片
- UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
- // 使当前的context出堆栈
- UIGraphicsEndImageContext();
- // 返回新的改变大小后的图片
- return scaledImage;
- }
- //按照最短边缩放 maxlength 边长最大值
- - (UIImage *)nx_scaleWithMaxLength:(float)maxLength
- {
- if (self.size.width > maxLength || self.size.height > maxLength)
- {
- float maxWidth = maxLength;
- float maxHeight = maxLength;
- if (self.size.width != self.size.height)
- {
- if (self.size.width > self.size.height)
- {
- //按照宽 来缩放
- float imageScale = maxLength / self.size.width;
- maxHeight = self.size.height * imageScale;
- }
- else if (self.size.width < self.size.height)
- {
- float imageScale = maxLength / self.size.height;
- maxWidth = self.size.width * imageScale;
- }
- }
- // 返回新的改变大小后的图片
- return [self nx_scaleToSize:CGSizeMake(maxWidth, maxHeight)];
- }
- return self;
- }
- #pragma mark - 截取
- - (UIImage *)nx_imageByCroppingWithStyle:(NXCropImageStyle)style
- {
- CGRect rect = CGRectZero;
- switch (style)
- {
- case NXCropImageStyleLeft:
- rect = CGRectMake(0, 0, self.size.width / 2, self.size.height);
- break;
- case NXCropImageStyleCenter:
- rect = CGRectMake(self.size.width / 4, 0, self.size.width / 2, self.size.height);
- break;
- case NXCropImageStyleRight:
- rect = CGRectMake(self.size.width / 2, 0, self.size.width / 2, self.size.height);
- break;
- case NXCropImageStyleLeftOneOfThird:
- rect = CGRectMake(0, 0, self.size.width / 3, self.size.height);
- break;
- case NXCropImageStyleCenterOneOfThird:
- rect = CGRectMake(self.size.width / 3, 0, self.size.width / 3, self.size.height);
- break;
- case NXCropImageStyleRightOneOfThird:
- rect = CGRectMake(self.size.width / 3 * 2, 0, self.size.width / 3, self.size.height);
- break;
- case NXCropImageStyleLeftQuarter:
- rect = CGRectMake(0, 0, self.size.width / 4, self.size.height);
- break;
- case NXCropImageStyleCenterLeftQuarter:
- rect = CGRectMake(self.size.width / 4, 0, self.size.width / 4, self.size.height);
- break;
- case NXCropImageStyleCenterRightQuarter:
- rect = CGRectMake(self.size.width / 4 * 2, 0, self.size.width / 4, self.size.height);
- break;
- case NXCropImageStyleRightQuarter:
- rect = CGRectMake(self.size.width / 4 * 3, 0, self.size.width / 4, self.size.height);
- break;
- default:
- break;
- }
- return [self imageByCroppingWithRect:rect];
- }
- - (UIImage *)imageByCroppingWithRect:(CGRect)rect
- {
- CGImageRef imageRef = self.CGImage;
- CGImageRef imagePartRef = CGImageCreateWithImageInRect(imageRef, rect);
- UIImage *cropImage = [UIImage imageWithCGImage:imagePartRef];
- CGImageRelease(imagePartRef);
- return cropImage;
- }
- - (UIImage *)nx_cropImageToSquare{
- if(self.size.width == self.size.height)
- {
- return self;
- }
- double w = self.size.width;
- double h = self.size.height;
- double m = MIN(w, h);
- CGRect rect = CGRectMake((self.size.width - m)/2.0f , (self.size.height - m)/2.0f, m, m);
- return [self imageByCroppingWithRect:rect];
- }
- - (UIImage *)nx_zoomWithSize:(CGSize)size{
- if(self == nil)
- {
- return nil;
- }
-
- double w = self.size.width;
- double h =self.size.height;
- double vRatio = w / size.width;
- double hRatio = h / size.height;
- double ratio = MAX(vRatio, hRatio);
- w /= ratio;
- h /= ratio;
- CGRect drawRect = CGRectMake((size.width - w)/2.0f , (size.height - h)/2.0f, w, h);
- // 创建一个bitmap的context
- // 并把它设置成为当前正在使用的context
- UIGraphicsBeginImageContext(size);
- // 绘制改变大小的图片
- [self drawInRect:drawRect];
- // 从当前context中创建一个改变大小后的图片
- UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
- // 使当前的context出堆栈
- UIGraphicsEndImageContext();
- return scaledImage;
-
- }
- - (UIImage *)nx_zoomImageToSquare
- {
- if (self == nil)
- {
- return nil;
- }
- double tw = MIN(self.size.width, self.size.height);
- return [self nx_scaleToSize:CGSizeMake(tw, tw)];
- }
- //截屏 有透明的
- + (UIImage *)nx_screenHierarchyShots:(UIView *)view { return [UIImage nx_screenHierarchyShots:view isOpaque:NO]; }
- //高清截屏 opaque 是否有透明图层
- + (UIImage *)nx_screenHierarchyShots:(UIView *)view isOpaque:(BOOL)opaque
- {
- // size——同UIGraphicsBeginImageContext
- // opaque—透明开关,如果图形完全不用透明,设置为YES以优化位图的存储。
- // scale—–缩放因子
- UIGraphicsBeginImageContextWithOptions(view.bounds.size, opaque, 0);
- [view.layer renderInContext:UIGraphicsGetCurrentContext()];
- UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return image;
- }
- /// 获得裁剪后的图片
- + (UIImage *)nx_cropImageView:(UIImageView *)imageView
- toRect:(CGRect)rect
- zoomScale:(double)zoomScale
- containerView:(UIView *)containerView
- outputWith:(CGFloat)outputWith
- {
- CGAffineTransform transform = CGAffineTransformIdentity;
- // 平移的处理
- CGRect imageViewRect = [imageView convertRect:imageView.bounds toView:containerView];
- CGPoint point = CGPointMake(imageViewRect.origin.x + imageViewRect.size.width / 2,
- imageViewRect.origin.y + imageViewRect.size.height / 2);
- CGPoint zeroPoint =
- CGPointMake(CGRectGetWidth(containerView.frame) / 2., CGRectGetHeight(containerView.frame) / 2.);
- CGPoint translation = CGPointMake(point.x - zeroPoint.x, point.y - zeroPoint.y);
- transform = CGAffineTransformTranslate(transform, translation.x, translation.y);
- // 缩放的处理
- transform = CGAffineTransformScale(transform, zoomScale, zoomScale);
- CGImageRef imageRef = [self nx_newTransformedImage:transform
- sourceImage:imageView.image.CGImage
- sourceSize:imageView.image.size
- outputWidth:outputWith
- cropSize:rect.size
- imageViewSize:imageView.frame.size];
- UIImage *cropedImage = [UIImage imageWithCGImage:imageRef];
- CGImageRelease(imageRef);
- return cropedImage;
- }
- + (CGImageRef)nx_newTransformedImage:(CGAffineTransform)transform
- sourceImage:(CGImageRef)sourceImage
- sourceSize:(CGSize)sourceSize
- outputWidth:(CGFloat)outputWidth
- cropSize:(CGSize)cropSize
- imageViewSize:(CGSize)imageViewSize
- {
- CGImageRef source = [self nx_newScaledImage:sourceImage toSize:sourceSize];
- CGFloat aspect = cropSize.height / cropSize.width;
- CGSize outputSize = CGSizeMake(outputWidth, outputWidth * aspect);
- CGContextRef context =
- CGBitmapContextCreate(NULL, outputSize.width, outputSize.height, CGImageGetBitsPerComponent(source), 0,
- CGImageGetColorSpace(source), CGImageGetBitmapInfo(source));
- CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
- CGContextFillRect(context, CGRectMake(0, 0, outputSize.width, outputSize.height));
- CGAffineTransform uiCoords =
- CGAffineTransformMakeScale(outputSize.width / cropSize.width, outputSize.height / cropSize.height);
- uiCoords = CGAffineTransformTranslate(uiCoords, cropSize.width / 2.0, cropSize.height / 2.0);
- uiCoords = CGAffineTransformScale(uiCoords, 1.0, -1.0);
- CGContextConcatCTM(context, uiCoords);
- CGContextConcatCTM(context, transform);
- CGContextScaleCTM(context, 1.0, -1.0);
- CGContextDrawImage(context, CGRectMake(-imageViewSize.width / 2, -imageViewSize.height / 2.0, imageViewSize.width,
- imageViewSize.height),
- source);
- CGImageRef resultRef = CGBitmapContextCreateImage(context);
- CGContextRelease(context);
- CGImageRelease(source);
- return resultRef;
- }
- + (CGImageRef)nx_newScaledImage:(CGImageRef)source toSize:(CGSize)size
- {
- CGSize srcSize = size;
- CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
- CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, rgbColorSpace,
- kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
- CGColorSpaceRelease(rgbColorSpace);
- CGContextSetInterpolationQuality(context, kCGInterpolationNone);
- CGContextTranslateCTM(context, size.width / 2, size.height / 2);
- CGContextDrawImage(context, CGRectMake(-srcSize.width / 2, -srcSize.height / 2, srcSize.width, srcSize.height),
- source);
- CGImageRef resultRef = CGBitmapContextCreateImage(context);
- CGContextRelease(context);
- return resultRef;
- }
- #pragma mark - 圆角
- + (UIImage *)nx_circleImage:(UIImage *)img
- {
- return [self nx_circleImage:img cuttingDirection:UIRectCornerAllCorners cornerRadii:img.size.height/2. borderWidth:0 borderColor: [UIColor clearColor] backgroundColor: [UIColor clearColor]];
- }
- + (UIImage *)nx_circleImage:(UIImage *)image cuttingDirection:(UIRectCorner)direction cornerRadii:(CGFloat)cornerRadii borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor backgroundColor:(UIColor *)backgroundColor
- {
- //处理后的数据
- UIImage * newImage = nil;
- if (image.size.height != 0 && image.size.width != 0)
- {
- if (cornerRadii == 0)
- {
- cornerRadii = image.size.height / 2;
- }
- CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
- UIGraphicsBeginImageContextWithOptions(rect.size, NO, [UIScreen mainScreen].scale);
- CGContextRef currnetContext = UIGraphicsGetCurrentContext();
- if (currnetContext) {
-
- UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:direction cornerRadii:CGSizeMake(cornerRadii - borderWidth, cornerRadii - borderWidth)];
- CGContextAddPath(currnetContext,path.CGPath);
- CGContextClip(currnetContext);
-
- [image drawInRect:rect];
- [borderColor setStroke];// 画笔颜色
- [backgroundColor setFill];// 填充颜色
- [path stroke];
- [path fill];
- newImage = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- }
-
- return newImage;
- }
-
- return newImage;
- }
- + (UIImage *)nx_launchImage
- {
- CGSize viewSize = [UIScreen mainScreen].bounds.size;
-
- NSString * viewOrientation = @"Portrait";
- NSString * launchImageName = nil;
- NSArray * imageDict = [[[NSBundle mainBundle] infoDictionary]valueForKey:@"UILaunchImages"];
- for (NSDictionary * dict in imageDict)
- {
- CGSize imageSize = CGSizeFromString(dict[@"UILaunchImageSize"]);
- if (CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]])
- {
- launchImageName = dict[@"UILaunchImageName"];
- }
- }
- UIImage * launchImage = [UIImage imageNamed:launchImageName];
-
- return launchImage;
- }
- + (UIImage*)transparentBackClear:(UIImage*)image color:(UIColor*)color
- {
- // 分配内存
- const int imageWidth = image.size.width;
- const int imageHeight = image.size.height;
- size_t bytesPerRow = imageWidth * 4;
- uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight);
-
- // 创建context
- CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
- CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpace,
- kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
- CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);
-
- // 遍历像素
- int pixelNum = imageWidth * imageHeight;
- uint32_t* pCurPtr = rgbImageBuf;
- for (int i = 0; i < pixelNum; i++, pCurPtr++)
- {
- if ((*pCurPtr & 0xFFFFFF00) == 0xffffff00) {
-
- // 此处把白色背景颜色给变为透明
- uint8_t* ptr = (uint8_t*)pCurPtr;
- ptr[0] = 0;
-
- }else{
-
- // 改成下面的代码,会将图片转成想要的
- // uint8_t* ptr = (uint8_t*)pCurPtr;
- //
- // ptr[3] = 0; //0~255
- //
- // ptr[2] = 0;
- //
- // ptr[1] = 0;
- }
- }
-
- // 将内存转成image
- CGDataProviderRef dataProvider =CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, ProviderReleaseData);
-
- CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight,8, 32, bytesPerRow, colorSpace,
- kCGImageAlphaLast |kCGBitmapByteOrder32Little, dataProvider,
- NULL, true,kCGRenderingIntentDefault);
- CGDataProviderRelease(dataProvider);
-
- UIImage* resultUIImage = [UIImage imageWithCGImage:imageRef];
-
- // 释放
- CGImageRelease(imageRef);
- CGContextRelease(context);
- CGColorSpaceRelease(colorSpace);
-
- return resultUIImage;
- }
- void ProviderReleaseData (void *info, const void *data, size_t size)
- {
- free((void*)data);
- }
- @end
|