UIImage+STCommon.m 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. //
  2. // UIImage+STCommon.m
  3. // BuguLive
  4. //
  5. // Created by 岳克奎 on 17/3/13.
  6. // Copyright © 2017年 xfg. All rights reserved.
  7. //
  8. #import "UIImage+STCommon.h"
  9. #import <Accelerate/Accelerate.h>
  10. @implementation UIImage (STCommon)
  11. +(UIImage *)st_thumbnailImageForVideo:(NSURL *)videoURL atTime:(NSTimeInterval)time {
  12. UIImage *thumbnailImage;
  13. @autoreleasepool {
  14. AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
  15. NSParameterAssert(asset);
  16. AVAssetImageGenerator *assetImageGenerator =[[AVAssetImageGenerator alloc] initWithAsset:asset];
  17. //获取任意帧
  18. assetImageGenerator.requestedTimeToleranceAfter = kCMTimeZero;
  19. assetImageGenerator.requestedTimeToleranceBefore = kCMTimeZero;
  20. assetImageGenerator.appliesPreferredTrackTransform = YES;
  21. assetImageGenerator.apertureMode =AVAssetImageGeneratorApertureModeEncodedPixels;
  22. CGImageRef thumbnailImageRef = NULL;
  23. CFTimeInterval thumbnailImageTime = time;
  24. NSError *thumbnailImageGenerationError = nil;
  25. thumbnailImageRef = [assetImageGenerator copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 1)actualTime:NULL error:&thumbnailImageGenerationError];
  26. if(!thumbnailImageRef)
  27. NSLog(@"thumbnailImageGenerationError %@",thumbnailImageGenerationError);
  28. thumbnailImage = thumbnailImageRef ? [[UIImage alloc]initWithCGImage:thumbnailImageRef] : nil;
  29. }
  30. return thumbnailImage;
  31. }
  32. #pragma mark - 1.0 高斯模糊
  33. /**
  34. * CoreImage:
  35. * iOS5.0之后就出现了Core Image的API,Core Image的API被放在CoreImage.framework库中, 在iOS和OS X平台上,Core Image都提供了大量的(Filter),在OS X上有120多种Filter,而在iOS上也有90多。
  36. *
  37. */
  38. +(UIImage *)coreBlurImage:(UIImage *)image withBlurNumber:(CGFloat)blur
  39. {
  40. CIContext *context = [CIContext contextWithOptions:nil];
  41. CIImage *inputImage= [CIImage imageWithCGImage:image.CGImage];
  42. //设置filter
  43. CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
  44. [filter setValue:inputImage forKey:kCIInputImageKey]; [filter setValue:@(blur) forKey: @"inputRadius"];
  45. //模糊图片
  46. CIImage *result=[filter valueForKey:kCIOutputImageKey];
  47. CGImageRef outImage=[context createCGImage:result fromRect:[result extent]];
  48. UIImage *blurImage=[UIImage imageWithCGImage:outImage];
  49. CGImageRelease(outImage);
  50. return blurImage;
  51. }
  52. /**
  53. * vImage
  54. * vImage属于Accelerate.Framework,需要导入 Accelerate下的 Accelerate头文件, Accelerate主要是用来做数字信号处理、图像处理相关的向量、矩阵运算的库。图像可以认为是由向量或者矩阵数据构成的,Accelerate里既然提供了高效的数学运算API,自然就能方便我们对图像做各种各样的处理 ,模糊算法使用的是vImageBoxConvolve_ARGB8888这个函数。
  55. *
  56. */
  57. +(UIImage *)boxblurImage:(UIImage *)image withBlurNumber:(CGFloat)blur
  58. {
  59. if (blur < 0.f || blur > 1.f) {
  60. blur = 0.5f;
  61. }
  62. int boxSize = (int)(blur * 40);
  63. boxSize = boxSize - (boxSize % 2) + 1;
  64. CGImageRef img = image.CGImage;
  65. vImage_Buffer inBuffer, outBuffer;
  66. vImage_Error error;
  67. void *pixelBuffer;
  68. //从CGImage中获取数据
  69. CGDataProviderRef inProvider = CGImageGetDataProvider(img);
  70. CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
  71. //设置从CGImage获取对象的属性
  72. inBuffer.width = CGImageGetWidth(img);
  73. inBuffer.height = CGImageGetHeight(img);
  74. inBuffer.rowBytes = CGImageGetBytesPerRow(img);
  75. inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
  76. pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
  77. if(pixelBuffer == NULL)
  78. NSLog(@"No pixelbuffer");
  79. outBuffer.data = pixelBuffer;
  80. outBuffer.width = CGImageGetWidth(img);
  81. outBuffer.height = CGImageGetHeight(img);
  82. outBuffer.rowBytes = CGImageGetBytesPerRow(img);
  83. error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
  84. if (error) {
  85. NSLog(@"error from convolution %ld", error);
  86. }
  87. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  88. CGContextRef ctx = CGBitmapContextCreate( outBuffer.data, outBuffer.width, outBuffer.height, 8, outBuffer.rowBytes, colorSpace, kCGImageAlphaNoneSkipLast);
  89. CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
  90. UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
  91. //clean up CGContextRelease(ctx);
  92. CGColorSpaceRelease(colorSpace);
  93. free(pixelBuffer);
  94. CFRelease(inBitmapData);
  95. CGColorSpaceRelease(colorSpace);
  96. CGImageRelease(imageRef);
  97. return returnImage;
  98. }
  99. #pragma mark -图片加文字
  100. /**
  101. * @brief: 单张图片+一行文字
  102. *
  103. * @parameter: bgImg 背景img
  104. * @parameter: contentStr
  105. * @parameter: strColor
  106. * @parameter: fontSize
  107. * @parameter: contentStrFrame
  108. *
  109. */
  110. +(UIImage *)showBgImge:(UIImage *)bgImg
  111. contentStr:(NSString *)contentStr
  112. strColor:(UIColor *)strColor
  113. contentStrFontSize:(CGFloat)fontSize
  114. strFrame:(CGRect)contentStrFrame {
  115. // 开启图形 '上下文'
  116. UIGraphicsBeginImageContextWithOptions(bgImg.size, NO, 0);
  117. // 绘制原生图片
  118. [bgImg drawAtPoint:CGPointZero];
  119. // 在原生图上绘制文字
  120. NSString *str = contentStr;
  121. // 创建文字属性字典
  122. NSDictionary *dictionary = @{NSForegroundColorAttributeName: strColor,
  123. NSFontAttributeName: [UIFont systemFontOfSize:fontSize]};
  124. // 绘制文字属性
  125. [str drawInRect:contentStrFrame withAttributes:dictionary];
  126. // 从当前上下文获取修改后的图片
  127. UIImage *newImg = UIGraphicsGetImageFromCurrentImageContext();
  128. // 结束图形上下文
  129. UIGraphicsEndImageContext();
  130. return newImg;
  131. }
  132. +(UIImage *)showBgImge:(UIImage *)bgImg contentStr:(NSString *)contentStr otherStr:(NSString *)otherStr strColor:(UIColor *)strColor contentStrFontSize:(CGFloat)fontSize strFrame:(CGRect)contentStrFrame otherStrFrame:(CGRect)otherStrFrame{
  133. // 开启图形 '上下文'
  134. UIGraphicsBeginImageContextWithOptions(bgImg.size, NO, 0);
  135. // 绘制原生图片
  136. [bgImg drawAtPoint:CGPointZero];
  137. // 在原生图上绘制文字
  138. NSString *str = contentStr;
  139. // 创建文字属性字典
  140. NSDictionary *dictionary = @{NSForegroundColorAttributeName: strColor,
  141. NSFontAttributeName: [UIFont systemFontOfSize:fontSize]};
  142. // 绘制文字属性
  143. [str drawInRect:contentStrFrame withAttributes:dictionary];
  144. // 从当前上下文获取修改后的图片
  145. UIImage *newImg = UIGraphicsGetImageFromCurrentImageContext();
  146. // 结束图形上下文
  147. UIGraphicsEndImageContext();
  148. return newImg;
  149. }
  150. @end