UIControl+NXCategory.m 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  1. //
  2. // UIControl+acceptEventInterval.m
  3. // NXlib
  4. //
  5. // Created by AK on 15/9/15.
  6. // Copyright (c) 2015年 AK. All rights reserved.
  7. //
  8. #import "UIControl+NXCategory.h"
  9. #if TARGET_OS_IPHONE
  10. #import <objc/message.h>
  11. #import <objc/runtime.h>
  12. #else
  13. #import <objc/objc-class.h>
  14. #endif
  15. @implementation UIControl (NXCategory)
  16. static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";
  17. static const char *UIControl_ignoreEvent = "UIControl_ignoreEvent";
  18. //改变两个方法的实现。在类第一次使用的时候回调用这个方法
  19. + (void)load
  20. {
  21. Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
  22. Method b = class_getInstanceMethod(self, @selector(__uxy_sendAction:to:forEvent:));
  23. //改变两个方法的实现
  24. method_exchangeImplementations(a, b); // isnt
  25. }
  26. //通过关联对象重写get和set方法
  27. - (NSTimeInterval)uxy_acceptEventInterval
  28. {
  29. return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];
  30. }
  31. - (void)setUxy_acceptEventInterval:(NSTimeInterval)uxy_acceptEventInterval
  32. {
  33. objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(uxy_acceptEventInterval),
  34. OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  35. }
  36. #pragma mark 现在是否可点的get和set。通过关联对象。
  37. - (void)setIgnoreEvent:(BOOL)ignoreEvent
  38. {
  39. objc_setAssociatedObject(self, UIControl_ignoreEvent, @(ignoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  40. }
  41. - (BOOL)ignoreEvent { return [objc_getAssociatedObject(self, UIControl_ignoreEvent) boolValue]; }
  42. - (void)__uxy_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
  43. {
  44. if (self.ignoreEvent)
  45. {
  46. NSLog(@"无效点击!!!!!!!!!!");
  47. return;
  48. }
  49. if (self.uxy_acceptEventInterval > 0)
  50. {
  51. self.ignoreEvent = YES;
  52. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.uxy_acceptEventInterval * NSEC_PER_SEC)),
  53. dispatch_get_main_queue(), ^{
  54. self.ignoreEvent = NO;
  55. });
  56. }
  57. //调用系统实现
  58. [self __uxy_sendAction:action to:target forEvent:event];
  59. }
  60. @end
  61. #import <Accelerate/Accelerate.h>
  62. @implementation UIImage (NXCategory)
  63. #pragma mark - blur 效果
  64. + (UIImage *)nx_blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur
  65. {
  66. CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];
  67. CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"
  68. keysAndValues:kCIInputImageKey, inputImage, @"inputRadius", @(blur), nil];
  69. CIImage *outputImage = filter.outputImage;
  70. CIContext *context = [CIContext contextWithOptions:nil];
  71. CGImageRef outImage = [context createCGImage:outputImage fromRect:[outputImage extent]];
  72. return [UIImage imageWithCGImage:outImage];
  73. }
  74. + (UIImage *)nx_boxblurImage:(UIImage *)toBlurImage
  75. {
  76. UIImage *newImage =
  77. [toBlurImage nx_scaleToSize:CGSizeMake(toBlurImage.size.width / 2., toBlurImage.size.height / 2.)];
  78. NSData *jpgData = UIImageJPEGRepresentation(newImage, 0.01);
  79. UIImage *image = [UIImage imageWithData:jpgData];
  80. CGFloat blur = 0.3f;
  81. int boxSize = (int)(blur * 40);
  82. boxSize = boxSize - (boxSize % 2) + 1;
  83. CGImageRef img = image.CGImage;
  84. vImage_Buffer inBuffer, outBuffer;
  85. vImage_Error error;
  86. void *pixelBuffer;
  87. // create vImage_Buffer with data from CGImageRef
  88. CGDataProviderRef inProvider = CGImageGetDataProvider(img);
  89. CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
  90. inBuffer.width = CGImageGetWidth(img);
  91. inBuffer.height = CGImageGetHeight(img);
  92. inBuffer.rowBytes = CGImageGetBytesPerRow(img);
  93. inBuffer.data = (void *)CFDataGetBytePtr(inBitmapData);
  94. // create vImage_Buffer for output
  95. pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
  96. if (pixelBuffer == NULL) NSLog(@"No pixelbuffer");
  97. outBuffer.data = pixelBuffer;
  98. outBuffer.width = CGImageGetWidth(img);
  99. outBuffer.height = CGImageGetHeight(img);
  100. outBuffer.rowBytes = CGImageGetBytesPerRow(img);
  101. // perform convolution
  102. error =
  103. vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend)
  104. ?: vImageBoxConvolve_ARGB8888(&outBuffer, &inBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend)
  105. ?: vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL,
  106. kvImageEdgeExtend);
  107. if (error)
  108. {
  109. NSLog(@"error from convolution %ld", error);
  110. }
  111. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  112. CGContextRef ctx = CGBitmapContextCreate(outBuffer.data, outBuffer.width, outBuffer.height, 8, outBuffer.rowBytes,
  113. colorSpace, (CGBitmapInfo)kCGImageAlphaNoneSkipLast);
  114. CGImageRef imageRef = CGBitmapContextCreateImage(ctx);
  115. UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
  116. // clean up
  117. CGContextRelease(ctx);
  118. CGColorSpaceRelease(colorSpace);
  119. free(pixelBuffer);
  120. CFRelease(inBitmapData);
  121. CGImageRelease(imageRef);
  122. return returnImage;
  123. }
  124. #pragma mark - 旋转
  125. + (UIImage *)nx_fixOrientation:(UIImage *)aImage isFront:(BOOL)isFront;
  126. {
  127. // No-op if the orientation is already correct
  128. if (aImage.imageOrientation == UIImageOrientationUp) return aImage;
  129. // We need to calculate the proper transformation to make the image upright.
  130. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
  131. CGAffineTransform transform = CGAffineTransformIdentity;
  132. if (isFront)
  133. {
  134. transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
  135. transform = CGAffineTransformScale(transform, -1, 1);
  136. }
  137. switch (aImage.imageOrientation)
  138. {
  139. case UIImageOrientationDown:
  140. case UIImageOrientationDownMirrored:
  141. transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
  142. transform = CGAffineTransformRotate(transform, M_PI);
  143. break;
  144. case UIImageOrientationLeft:
  145. case UIImageOrientationLeftMirrored:
  146. transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
  147. transform = CGAffineTransformRotate(transform, M_PI_2);
  148. break;
  149. case UIImageOrientationRight:
  150. case UIImageOrientationRightMirrored:
  151. transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);
  152. transform = CGAffineTransformRotate(transform, -M_PI_2);
  153. break;
  154. default:
  155. break;
  156. }
  157. switch (aImage.imageOrientation)
  158. {
  159. case UIImageOrientationUpMirrored:
  160. case UIImageOrientationDownMirrored:
  161. transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
  162. transform = CGAffineTransformScale(transform, -1, 1);
  163. break;
  164. case UIImageOrientationLeftMirrored:
  165. case UIImageOrientationRightMirrored:
  166. transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);
  167. transform = CGAffineTransformScale(transform, -1, 1);
  168. break;
  169. default:
  170. break;
  171. }
  172. // Now we draw the underlying CGImage into a new context, applying the
  173. // transform
  174. // calculated above.
  175. CGContextRef ctx =
  176. CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height, CGImageGetBitsPerComponent(aImage.CGImage),
  177. 0, CGImageGetColorSpace(aImage.CGImage), CGImageGetBitmapInfo(aImage.CGImage));
  178. CGContextConcatCTM(ctx, transform);
  179. switch (aImage.imageOrientation)
  180. {
  181. case UIImageOrientationLeft:
  182. case UIImageOrientationLeftMirrored:
  183. case UIImageOrientationRight:
  184. case UIImageOrientationRightMirrored:
  185. // Grr...
  186. CGContextDrawImage(ctx, CGRectMake(0, 0, aImage.size.height, aImage.size.width), aImage.CGImage);
  187. break;
  188. default:
  189. CGContextDrawImage(ctx, CGRectMake(0, 0, aImage.size.width, aImage.size.height), aImage.CGImage);
  190. break;
  191. }
  192. // And now we just create a new UIImage from the drawing context
  193. CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
  194. UIImage *img = [UIImage imageWithCGImage:cgimg];
  195. CGContextRelease(ctx);
  196. CGImageRelease(cgimg);
  197. return img;
  198. }
  199. // 旋转
  200. + (UIImage *)nx_rotationImage:(UIImage *)image orientation:(UIImageOrientation)orientation
  201. {
  202. long double rotate = 0.0;
  203. CGRect rect;
  204. float translateX = 0;
  205. float translateY = 0;
  206. float scaleX = 1.0;
  207. float scaleY = 1.0;
  208. switch (orientation)
  209. {
  210. case UIImageOrientationLeft:
  211. rotate = M_PI_2;
  212. rect = CGRectMake(0, 0, image.size.height, image.size.width);
  213. translateX = 0;
  214. translateY = -rect.size.width;
  215. scaleY = rect.size.width / rect.size.height;
  216. scaleX = rect.size.height / rect.size.width;
  217. break;
  218. case UIImageOrientationRight:
  219. rotate = 3 * M_PI_2;
  220. rect = CGRectMake(0, 0, image.size.height, image.size.width);
  221. translateX = -rect.size.height;
  222. translateY = 0;
  223. scaleY = rect.size.width / rect.size.height;
  224. scaleX = rect.size.height / rect.size.width;
  225. break;
  226. case UIImageOrientationDown:
  227. rotate = M_PI;
  228. rect = CGRectMake(0, 0, image.size.width, image.size.height);
  229. translateX = -rect.size.width;
  230. translateY = -rect.size.height;
  231. break;
  232. default:
  233. rotate = 0.0;
  234. rect = CGRectMake(0, 0, image.size.width, image.size.height);
  235. translateX = 0;
  236. translateY = 0;
  237. break;
  238. }
  239. UIGraphicsBeginImageContext(rect.size);
  240. CGContextRef context = UIGraphicsGetCurrentContext();
  241. //做CTM变换
  242. CGContextTranslateCTM(context, 0.0, rect.size.height);
  243. CGContextScaleCTM(context, 1.0, -1.0);
  244. CGContextRotateCTM(context, rotate);
  245. CGContextTranslateCTM(context, translateX, translateY);
  246. CGContextScaleCTM(context, scaleX, scaleY);
  247. //绘制图片
  248. CGContextDrawImage(context, CGRectMake(0, 0, rect.size.width, rect.size.height), image.CGImage);
  249. UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext();
  250. NSLog(@"image size %f---%f", image.size.width, image.size.height);
  251. UIGraphicsEndImageContext();
  252. return newPic;
  253. }
  254. #pragma mark - 缩放
  255. - (UIImage *)nx_scaleToSize:(CGSize)size
  256. {
  257. CGFloat width = CGImageGetWidth(self.CGImage);
  258. CGFloat height = CGImageGetHeight(self.CGImage);
  259. float verticalRadio = size.height * 1.0 / height;
  260. float horizontalRadio = size.width * 1.0 / width;
  261. float radio = 1;
  262. if (verticalRadio > 1 && horizontalRadio > 1)
  263. {
  264. radio = verticalRadio > horizontalRadio ? horizontalRadio : verticalRadio;
  265. }
  266. else
  267. {
  268. radio = verticalRadio < horizontalRadio ? verticalRadio : horizontalRadio;
  269. }
  270. width = width * radio;
  271. height = height * radio;
  272. int xPos = (size.width - width) / 2;
  273. int yPos = (size.height - height) / 2;
  274. // 创建一个bitmap的context
  275. // 并把它设置成为当前正在使用的context
  276. UIGraphicsBeginImageContext(size);
  277. // 绘制改变大小的图片
  278. [self drawInRect:CGRectMake(xPos, yPos, width, height)];
  279. // 从当前context中创建一个改变大小后的图片
  280. UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
  281. // 使当前的context出堆栈
  282. UIGraphicsEndImageContext();
  283. // 返回新的改变大小后的图片
  284. return scaledImage;
  285. }
  286. //按照最短边缩放 maxlength 边长最大值
  287. - (UIImage *)nx_scaleWithMaxLength:(float)maxLength
  288. {
  289. if (self.size.width > maxLength || self.size.height > maxLength)
  290. {
  291. float maxWidth = maxLength;
  292. float maxHeight = maxLength;
  293. if (self.size.width != self.size.height)
  294. {
  295. if (self.size.width > self.size.height)
  296. {
  297. //按照宽 来缩放
  298. float imageScale = maxLength / self.size.width;
  299. maxHeight = self.size.height * imageScale;
  300. }
  301. else if (self.size.width < self.size.height)
  302. {
  303. float imageScale = maxLength / self.size.height;
  304. maxWidth = self.size.width * imageScale;
  305. }
  306. }
  307. // 返回新的改变大小后的图片
  308. return [self nx_scaleToSize:CGSizeMake(maxWidth, maxHeight)];
  309. }
  310. return self;
  311. }
  312. #pragma mark - 截取
  313. - (UIImage *)nx_imageByCroppingWithStyle:(NXCropImageStyle)style
  314. {
  315. CGRect rect = CGRectZero;
  316. switch (style)
  317. {
  318. case NXCropImageStyleLeft:
  319. rect = CGRectMake(0, 0, self.size.width / 2, self.size.height);
  320. break;
  321. case NXCropImageStyleCenter:
  322. rect = CGRectMake(self.size.width / 4, 0, self.size.width / 2, self.size.height);
  323. break;
  324. case NXCropImageStyleRight:
  325. rect = CGRectMake(self.size.width / 2, 0, self.size.width / 2, self.size.height);
  326. break;
  327. case NXCropImageStyleLeftOneOfThird:
  328. rect = CGRectMake(0, 0, self.size.width / 3, self.size.height);
  329. break;
  330. case NXCropImageStyleCenterOneOfThird:
  331. rect = CGRectMake(self.size.width / 3, 0, self.size.width / 3, self.size.height);
  332. break;
  333. case NXCropImageStyleRightOneOfThird:
  334. rect = CGRectMake(self.size.width / 3 * 2, 0, self.size.width / 3, self.size.height);
  335. break;
  336. case NXCropImageStyleLeftQuarter:
  337. rect = CGRectMake(0, 0, self.size.width / 4, self.size.height);
  338. break;
  339. case NXCropImageStyleCenterLeftQuarter:
  340. rect = CGRectMake(self.size.width / 4, 0, self.size.width / 4, self.size.height);
  341. break;
  342. case NXCropImageStyleCenterRightQuarter:
  343. rect = CGRectMake(self.size.width / 4 * 2, 0, self.size.width / 4, self.size.height);
  344. break;
  345. case NXCropImageStyleRightQuarter:
  346. rect = CGRectMake(self.size.width / 4 * 3, 0, self.size.width / 4, self.size.height);
  347. break;
  348. default:
  349. break;
  350. }
  351. return [self imageByCroppingWithRect:rect];
  352. }
  353. - (UIImage *)imageByCroppingWithRect:(CGRect)rect
  354. {
  355. CGImageRef imageRef = self.CGImage;
  356. CGImageRef imagePartRef = CGImageCreateWithImageInRect(imageRef, rect);
  357. UIImage *cropImage = [UIImage imageWithCGImage:imagePartRef];
  358. CGImageRelease(imagePartRef);
  359. return cropImage;
  360. }
  361. - (UIImage *)nx_cropImageToSquare{
  362. if(self.size.width == self.size.height)
  363. {
  364. return self;
  365. }
  366. double w = self.size.width;
  367. double h = self.size.height;
  368. double m = MIN(w, h);
  369. CGRect rect = CGRectMake((self.size.width - m)/2.0f , (self.size.height - m)/2.0f, m, m);
  370. return [self imageByCroppingWithRect:rect];
  371. }
  372. - (UIImage *)nx_zoomWithSize:(CGSize)size{
  373. if(self == nil)
  374. {
  375. return nil;
  376. }
  377. double w = self.size.width;
  378. double h =self.size.height;
  379. double vRatio = w / size.width;
  380. double hRatio = h / size.height;
  381. double ratio = MAX(vRatio, hRatio);
  382. w /= ratio;
  383. h /= ratio;
  384. CGRect drawRect = CGRectMake((size.width - w)/2.0f , (size.height - h)/2.0f, w, h);
  385. // 创建一个bitmap的context
  386. // 并把它设置成为当前正在使用的context
  387. UIGraphicsBeginImageContext(size);
  388. // 绘制改变大小的图片
  389. [self drawInRect:drawRect];
  390. // 从当前context中创建一个改变大小后的图片
  391. UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
  392. // 使当前的context出堆栈
  393. UIGraphicsEndImageContext();
  394. return scaledImage;
  395. }
  396. - (UIImage *)nx_zoomImageToSquare
  397. {
  398. if (self == nil)
  399. {
  400. return nil;
  401. }
  402. double tw = MIN(self.size.width, self.size.height);
  403. return [self nx_scaleToSize:CGSizeMake(tw, tw)];
  404. }
  405. //截屏 有透明的
  406. + (UIImage *)nx_screenHierarchyShots:(UIView *)view { return [UIImage nx_screenHierarchyShots:view isOpaque:NO]; }
  407. //高清截屏 opaque 是否有透明图层
  408. + (UIImage *)nx_screenHierarchyShots:(UIView *)view isOpaque:(BOOL)opaque
  409. {
  410. // size——同UIGraphicsBeginImageContext
  411. // opaque—透明开关,如果图形完全不用透明,设置为YES以优化位图的存储。
  412. // scale—–缩放因子
  413. UIGraphicsBeginImageContextWithOptions(view.bounds.size, opaque, 0);
  414. [view.layer renderInContext:UIGraphicsGetCurrentContext()];
  415. UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  416. UIGraphicsEndImageContext();
  417. return image;
  418. }
  419. /// 获得裁剪后的图片
  420. + (UIImage *)nx_cropImageView:(UIImageView *)imageView
  421. toRect:(CGRect)rect
  422. zoomScale:(double)zoomScale
  423. containerView:(UIView *)containerView
  424. outputWith:(CGFloat)outputWith
  425. {
  426. CGAffineTransform transform = CGAffineTransformIdentity;
  427. // 平移的处理
  428. CGRect imageViewRect = [imageView convertRect:imageView.bounds toView:containerView];
  429. CGPoint point = CGPointMake(imageViewRect.origin.x + imageViewRect.size.width / 2,
  430. imageViewRect.origin.y + imageViewRect.size.height / 2);
  431. CGPoint zeroPoint =
  432. CGPointMake(CGRectGetWidth(containerView.frame) / 2., CGRectGetHeight(containerView.frame) / 2.);
  433. CGPoint translation = CGPointMake(point.x - zeroPoint.x, point.y - zeroPoint.y);
  434. transform = CGAffineTransformTranslate(transform, translation.x, translation.y);
  435. // 缩放的处理
  436. transform = CGAffineTransformScale(transform, zoomScale, zoomScale);
  437. CGImageRef imageRef = [self nx_newTransformedImage:transform
  438. sourceImage:imageView.image.CGImage
  439. sourceSize:imageView.image.size
  440. outputWidth:outputWith
  441. cropSize:rect.size
  442. imageViewSize:imageView.frame.size];
  443. UIImage *cropedImage = [UIImage imageWithCGImage:imageRef];
  444. CGImageRelease(imageRef);
  445. return cropedImage;
  446. }
  447. + (CGImageRef)nx_newTransformedImage:(CGAffineTransform)transform
  448. sourceImage:(CGImageRef)sourceImage
  449. sourceSize:(CGSize)sourceSize
  450. outputWidth:(CGFloat)outputWidth
  451. cropSize:(CGSize)cropSize
  452. imageViewSize:(CGSize)imageViewSize
  453. {
  454. CGImageRef source = [self nx_newScaledImage:sourceImage toSize:sourceSize];
  455. CGFloat aspect = cropSize.height / cropSize.width;
  456. CGSize outputSize = CGSizeMake(outputWidth, outputWidth * aspect);
  457. CGContextRef context =
  458. CGBitmapContextCreate(NULL, outputSize.width, outputSize.height, CGImageGetBitsPerComponent(source), 0,
  459. CGImageGetColorSpace(source), CGImageGetBitmapInfo(source));
  460. CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
  461. CGContextFillRect(context, CGRectMake(0, 0, outputSize.width, outputSize.height));
  462. CGAffineTransform uiCoords =
  463. CGAffineTransformMakeScale(outputSize.width / cropSize.width, outputSize.height / cropSize.height);
  464. uiCoords = CGAffineTransformTranslate(uiCoords, cropSize.width / 2.0, cropSize.height / 2.0);
  465. uiCoords = CGAffineTransformScale(uiCoords, 1.0, -1.0);
  466. CGContextConcatCTM(context, uiCoords);
  467. CGContextConcatCTM(context, transform);
  468. CGContextScaleCTM(context, 1.0, -1.0);
  469. CGContextDrawImage(context, CGRectMake(-imageViewSize.width / 2, -imageViewSize.height / 2.0, imageViewSize.width,
  470. imageViewSize.height),
  471. source);
  472. CGImageRef resultRef = CGBitmapContextCreateImage(context);
  473. CGContextRelease(context);
  474. CGImageRelease(source);
  475. return resultRef;
  476. }
  477. + (CGImageRef)nx_newScaledImage:(CGImageRef)source toSize:(CGSize)size
  478. {
  479. CGSize srcSize = size;
  480. CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
  481. CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, rgbColorSpace,
  482. kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
  483. CGColorSpaceRelease(rgbColorSpace);
  484. CGContextSetInterpolationQuality(context, kCGInterpolationNone);
  485. CGContextTranslateCTM(context, size.width / 2, size.height / 2);
  486. CGContextDrawImage(context, CGRectMake(-srcSize.width / 2, -srcSize.height / 2, srcSize.width, srcSize.height),
  487. source);
  488. CGImageRef resultRef = CGBitmapContextCreateImage(context);
  489. CGContextRelease(context);
  490. return resultRef;
  491. }
  492. #pragma mark - 圆角
  493. + (UIImage *)nx_circleImage:(UIImage *)img
  494. {
  495. return [self nx_circleImage:img cuttingDirection:UIRectCornerAllCorners cornerRadii:img.size.height/2. borderWidth:0 borderColor: [UIColor clearColor] backgroundColor: [UIColor clearColor]];
  496. }
  497. + (UIImage *)nx_circleImage:(UIImage *)image cuttingDirection:(UIRectCorner)direction cornerRadii:(CGFloat)cornerRadii borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor backgroundColor:(UIColor *)backgroundColor
  498. {
  499. //处理后的数据
  500. UIImage * newImage = nil;
  501. if (image.size.height != 0 && image.size.width != 0)
  502. {
  503. if (cornerRadii == 0)
  504. {
  505. cornerRadii = image.size.height / 2;
  506. }
  507. CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
  508. UIGraphicsBeginImageContextWithOptions(rect.size, NO, [UIScreen mainScreen].scale);
  509. CGContextRef currnetContext = UIGraphicsGetCurrentContext();
  510. if (currnetContext) {
  511. UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:direction cornerRadii:CGSizeMake(cornerRadii - borderWidth, cornerRadii - borderWidth)];
  512. CGContextAddPath(currnetContext,path.CGPath);
  513. CGContextClip(currnetContext);
  514. [image drawInRect:rect];
  515. [borderColor setStroke];// 画笔颜色
  516. [backgroundColor setFill];// 填充颜色
  517. [path stroke];
  518. [path fill];
  519. newImage = UIGraphicsGetImageFromCurrentImageContext();
  520. UIGraphicsEndImageContext();
  521. }
  522. return newImage;
  523. }
  524. return newImage;
  525. }
  526. + (UIImage *)nx_launchImage
  527. {
  528. CGSize viewSize = [UIScreen mainScreen].bounds.size;
  529. NSString * viewOrientation = @"Portrait";
  530. NSString * launchImageName = nil;
  531. NSArray * imageDict = [[[NSBundle mainBundle] infoDictionary]valueForKey:@"UILaunchImages"];
  532. for (NSDictionary * dict in imageDict)
  533. {
  534. CGSize imageSize = CGSizeFromString(dict[@"UILaunchImageSize"]);
  535. if (CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]])
  536. {
  537. launchImageName = dict[@"UILaunchImageName"];
  538. }
  539. }
  540. UIImage * launchImage = [UIImage imageNamed:launchImageName];
  541. return launchImage;
  542. }
  543. + (UIImage*)transparentBackClear:(UIImage*)image color:(UIColor*)color
  544. {
  545. // 分配内存
  546. const int imageWidth = image.size.width;
  547. const int imageHeight = image.size.height;
  548. size_t bytesPerRow = imageWidth * 4;
  549. uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight);
  550. // 创建context
  551. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  552. CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpace,
  553. kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
  554. CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);
  555. // 遍历像素
  556. int pixelNum = imageWidth * imageHeight;
  557. uint32_t* pCurPtr = rgbImageBuf;
  558. for (int i = 0; i < pixelNum; i++, pCurPtr++)
  559. {
  560. if ((*pCurPtr & 0xFFFFFF00) == 0xffffff00) {
  561. // 此处把白色背景颜色给变为透明
  562. uint8_t* ptr = (uint8_t*)pCurPtr;
  563. ptr[0] = 0;
  564. }else{
  565. // 改成下面的代码,会将图片转成想要的
  566. // uint8_t* ptr = (uint8_t*)pCurPtr;
  567. //
  568. // ptr[3] = 0; //0~255
  569. //
  570. // ptr[2] = 0;
  571. //
  572. // ptr[1] = 0;
  573. }
  574. }
  575. // 将内存转成image
  576. CGDataProviderRef dataProvider =CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, ProviderReleaseData);
  577. CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight,8, 32, bytesPerRow, colorSpace,
  578. kCGImageAlphaLast |kCGBitmapByteOrder32Little, dataProvider,
  579. NULL, true,kCGRenderingIntentDefault);
  580. CGDataProviderRelease(dataProvider);
  581. UIImage* resultUIImage = [UIImage imageWithCGImage:imageRef];
  582. // 释放
  583. CGImageRelease(imageRef);
  584. CGContextRelease(context);
  585. CGColorSpaceRelease(colorSpace);
  586. return resultUIImage;
  587. }
  588. void ProviderReleaseData (void *info, const void *data, size_t size)
  589. {
  590. free((void*)data);
  591. }
  592. @end