UIImage+Extension.m 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. //
  2. // UIImage+Extension.m
  3. // SmartLightForBigFish
  4. //
  5. // Created by coderYK on 2017/8/7.
  6. // Copyright © 2017年 RD-iOS. All rights reserved.
  7. //
  8. #import "UIImage+Extension.h"
  9. #import "RDSRgbColor.h"
  10. @implementation UIImage (Extension)
  11. + (UIImage *)rds_imageWithColor:(UIColor *)color {
  12. CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
  13. UIGraphicsBeginImageContext(rect.size);
  14. CGContextRef context = UIGraphicsGetCurrentContext();
  15. CGContextSetFillColorWithColor(context, [color CGColor]);
  16. CGContextFillRect(context, rect);
  17. UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  18. UIGraphicsEndImageContext();
  19. return image;
  20. }
  21. + (UIImage *)rds_imageWithColor:(UIColor *)startColor toColor:(UIColor *)toColor imgSize:(CGSize)imgSize{
  22. NSMutableArray *ar = [NSMutableArray array];
  23. [ar addObject:(id)startColor.CGColor];
  24. [ar addObject:(id)toColor.CGColor];
  25. UIGraphicsBeginImageContextWithOptions(imgSize, YES, 1);
  26. CGContextRef context = UIGraphicsGetCurrentContext();
  27. CGContextSaveGState(context);
  28. CGColorSpaceRef colorSpace = CGColorGetColorSpace([toColor CGColor]);
  29. CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef)ar, NULL);
  30. CGPoint start;
  31. CGPoint end;
  32. //TopToBottom
  33. //start = CGPointMake(0.0, 0.0);
  34. //end = CGPointMake(0.0, imgSize.height);
  35. //LeftToRight
  36. start = CGPointMake(0.0, 0.0);
  37. end = CGPointMake(imgSize.width, 0.0);
  38. CGContextDrawLinearGradient(context, gradient, start, end, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
  39. UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  40. CGGradientRelease(gradient);
  41. CGContextRestoreGState(context);
  42. CGColorSpaceRelease(colorSpace);
  43. UIGraphicsEndImageContext();
  44. return image;
  45. }
  46. + (UIImage *)rds_imageWithName:(NSString *)imageName andBackgroundColor:(UIColor *)backgroundColor {
  47. UIImage *image = [UIImage imageNamed:imageName];
  48. CGFloat imageWH = image.size.width*1.5;
  49. CGRect frame = CGRectMake(0, 0, imageWH, imageWH);
  50. UIGraphicsBeginImageContext(frame.size);
  51. CGContextRef context = UIGraphicsGetCurrentContext();
  52. [[UIColor clearColor] set];
  53. CGContextFillRect(context, frame);
  54. CGContextAddEllipseInRect(context, frame);
  55. [backgroundColor set];
  56. CGContextFillPath(context);
  57. [image drawInRect:CGRectMake((imageWH-image.size.width)*0.5, (imageWH-image.size.height)*0.5, image.size.width, image.size.height)];
  58. image = UIGraphicsGetImageFromCurrentImageContext();
  59. UIGraphicsEndImageContext();
  60. return image;
  61. }
  62. + (UIImage *)rds_creatQRCodeWithData:(NSData *)data withSize:(CGFloat)size {
  63. // 1.实例化一个滤镜
  64. CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
  65. // 2.恢复滤镜的默认属性
  66. [filter setDefaults];
  67. // 4.通过 KVO 设置滤镜的 inputMessage 数据
  68. [filter setValue:data forKey:@"inputMessage"];
  69. // 5.获得滤镜输出的图像
  70. CIImage *outImage = [filter outputImage];
  71. // 6.将 CIImage 转为 UIImage
  72. return [self createNonInterpolatedUIImageFormCIImage:outImage withSize:size];
  73. }
  74. + (UIImage *)rds_creatQRCodeWithString:(NSString *)string withSize:(CGFloat)size {
  75. // 1.实例化一个滤镜
  76. CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
  77. // 2.恢复滤镜的默认属性
  78. [filter setDefaults];
  79. // 3.输入的字符串转换为二进制数据
  80. NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
  81. // 4.通过 KVO 设置滤镜的 inputMessage 数据
  82. [filter setValue:data forKey:@"inputMessage"];
  83. // 5.获得滤镜输出的图像
  84. CIImage *outImage = [filter outputImage];
  85. // 6.将 CIImage 转为 UIImage
  86. return [self createNonInterpolatedUIImageFormCIImage:outImage withSize:size];
  87. }
  88. /**
  89. * 传入CIImage,并指定对应的缩放比例
  90. *
  91. * @param image CIImage 对象
  92. * @param size 缩放系数
  93. *
  94. * @return 返回经过缩放处理的 UIImage 对象
  95. */
  96. + (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
  97. CGRect extent = CGRectIntegral(image.extent);
  98. CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
  99. // 创建bitmap;
  100. size_t width = CGRectGetWidth(extent) * scale;
  101. size_t height = CGRectGetHeight(extent) * scale;
  102. CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
  103. CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
  104. CIContext *context = [CIContext contextWithOptions:nil];
  105. CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
  106. CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
  107. CGContextScaleCTM(bitmapRef, scale, scale);
  108. CGContextDrawImage(bitmapRef, extent, bitmapImage);
  109. // 保存bitmap到图片
  110. CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
  111. CGContextRelease(bitmapRef);
  112. CGColorSpaceRelease(cs);
  113. CGImageRelease(bitmapImage);
  114. UIImage *outputImage = [UIImage imageWithCGImage:scaledImage];
  115. CGImageRelease(scaledImage);
  116. return outputImage;
  117. }
  118. + (UIImage *)rds_renderingOriginalimageWithName:(NSString *)imageName {
  119. UIImage *image = [UIImage imageNamed:imageName];
  120. return [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
  121. }
  122. - (RDSRgbColor *)rds_colorAtPixel:(CGPoint)point {
  123. if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), point)) { return nil; }
  124. NSInteger pointX = trunc(point.x);
  125. NSInteger pointY = trunc(point.y);
  126. CGImageRef cgImage = self.CGImage;
  127. NSUInteger width = self.size.width;
  128. NSUInteger height = self.size.height;
  129. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  130. int bytesPerPixel = 4;
  131. int bytesPerRow = bytesPerPixel * 1;
  132. NSUInteger bitsPerComponent = 8;
  133. unsigned char pixelData[4] = { 0, 0, 0, 0 };
  134. CGContextRef context = CGBitmapContextCreate(pixelData, 1, 1, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
  135. CGColorSpaceRelease(colorSpace);
  136. CGContextSetBlendMode(context, kCGBlendModeCopy);
  137. CGContextTranslateCTM(context, -pointX, pointY-(CGFloat)height);
  138. CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage);
  139. CGContextRelease(context);
  140. CGFloat red = (int)pixelData[0];
  141. if (red < 5) {
  142. red = 5;
  143. }
  144. CGFloat green = (int)pixelData[1];
  145. if (green < 5) {
  146. green = 5;
  147. }
  148. CGFloat blue = (int)pixelData[2];
  149. if (blue < 5) {
  150. blue = 5;
  151. }
  152. CGFloat alpha = (int)pixelData[3];
  153. // return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
  154. return [RDSRgbColor rds_rgbColorWithRgbArr:@[@(red), @(green), @(blue), @(alpha)]];
  155. }
  156. - (UIImage *)rds_imageScaleToSize:(CGSize)size{
  157. UIImage *image = self;
  158. UIGraphicsBeginImageContext(size);
  159. [image drawInRect:CGRectMake(0,0, size.width, size.height)];
  160. UIImage *scaleImage=UIGraphicsGetImageFromCurrentImageContext();
  161. UIGraphicsEndImageContext();
  162. return scaleImage;
  163. }
  164. - (UIImage *)rds_changeColorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue{
  165. UIImage *image = self;
  166. const int imageWidth = image.size.width;
  167. const int imageHeight = image.size.height;
  168. size_t bytesPerRow = imageWidth * 4;
  169. uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight);
  170. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  171. CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpace,
  172. kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
  173. CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);
  174. // 遍历像素
  175. int pixelNum = imageWidth * imageHeight;
  176. uint32_t* pCurPtr = rgbImageBuf;
  177. for (int i = 0; i < pixelNum; i++, pCurPtr++){
  178. if ((*pCurPtr & 0xFFFFFF00) < 0x99999900) // 将白色变成透明
  179. {
  180. // 改成下面的代码,会将图片转成想要的颜色
  181. uint8_t* ptr = (uint8_t*)pCurPtr;
  182. ptr[3] = red; //0~255
  183. ptr[2] = green;
  184. ptr[1] = blue;
  185. }
  186. else
  187. {
  188. uint8_t* ptr = (uint8_t*)pCurPtr;
  189. ptr[0] = 0;
  190. }
  191. }
  192. // 输出图片
  193. CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, ProviderReleaseData);
  194. CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight, 8, 32, bytesPerRow, colorSpace,
  195. kCGImageAlphaLast | kCGBitmapByteOrder32Little, dataProvider,
  196. NULL, true, kCGRenderingIntentDefault);
  197. CGDataProviderRelease(dataProvider);
  198. UIImage* resultUIImage = [UIImage imageWithCGImage:imageRef];
  199. // 清理空间
  200. CGImageRelease(imageRef);
  201. CGContextRelease(context);
  202. CGColorSpaceRelease(colorSpace);
  203. return resultUIImage;
  204. }
  205. void ProviderReleaseData (void *info, const void *data, size_t size){
  206. free((void*)data);
  207. }
  208. @end