{ guard let image = self.cgImage else { return nil } #if DEBUG attributes as Any) #endif // 输入CIImage let input = CIImage(cgImage: image) CIImage let output = input.applyingFilter(name, parameters: parameters) // 渲染图片(CIImage->CGImage ) guard let cgimage = CIContext(options: nil).createCGImage(output, from: input.extent) else { return nil } return UIImage(cgImage: cgimage) }
// 图像分析请求 lazy var imageRequestHandler = VNImageRequestHandler(ciImage: CIImage(cgImage: image.cgImage outputImage else { return } let context = CIContext(options: nil) let cgImage = context.createCGImage (outputImage, from: outputImage.extent) let uiImage = UIImage(cgImage: cgImage!) outputImage else { return } let context = CIContext(options: nil) let cgImage = context.createCGImage (outputImage, from: outputImage.extent) let uiImage = UIImage(cgImage: cgImage!)
withBlurLevel:(CGFloat)blur { CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage boxSize = (int)(blur * 100); boxSize = boxSize - (boxSize % 2) + 1; CGImageRef img = image.CGImage effectInContext, 0, -self.size.height); CGContextDrawImage(effectInContext, imageRect, self.CGImage outputContext, 0, -self.size.height); // 开始画底图 CGContextDrawImage(outputContext, imageRect, self.CGImage outputContext); if (maskImage) { CGContextClipToMask(outputContext, imageRect, maskImage.CGImage
{ guard let cgImage = image.cgImage else { return nil } // 创建图像格式 var format sourceBuffer = vImage_Buffer() var error = vImageBuffer_InitWithCGImage(&sourceBuffer, &format, nil, cgImage free(destinationBuffer.data) return nil } // 从vImage缓冲区创建新的CGImage = kvImageNoError { return nil } // 从CGImage创建UIImage return UIImage (cgImage: blurredImage.takeRetainedValue()) } } 效果。
{ guard let image = self.mooSnapshot() else { return nil } guard let cgImage = image.cgImage (to: scaledRect) else { return nil } let returnImage = UIImage(cgImage: scaledCGImage) scaledRect = CGRectApplyAffineTransform(frame, CGAffineTransformMakeScale(scale, scale)); CGImageRef cgImage = CGImageCreateWithImageInRect(image.CGImage, scaledRect); UIImage *returnImage = [UIImage imageWithCGImage :cgImage]; CGImageRelease(cgImage); return returnImage; } 以下就是将一个view的上半部分截取成image后展示如下: 3.旧方法
将滤镜中的图片渲染出来 14 CIContext *context = [CIContext contextWithOptions:nil]; 15 16 CGImageRef cgImage fromRect:[outImage extent]]; 18 19 //导出图片 20 UIImage *showImage = [UIImage imageWithCGImage:cgImage ]; 21 22 CGImageRelease(cgImage); 23 24 UIImageView *imageView = [[UIImageView alloc :[outputImage extent]]; 28 29 //导出图片 30 UIImage *showImage = [UIImage imageWithCGImage:cgImage ]; 31 32 CGImageRelease(cgImage); 33 34 UIImageView *imageView = [[UIImageView alloc
forKey:kCIInputImageKey]; CIImage *result = [filter valueForKey:kCIOutputImageKey]; CGImageRef cgImage createCGImage:result fromRect:[result extent]]; UIImage *resultImage = [UIImage imageWithCGImage:cgImage ]; CGImageRelease(cgImage); return resultImage; } 6.对图片进行模糊处理 // CIGaussianBlur ---> 高斯模糊 // createCGImage:result fromRect:[result extent]]; UIImage *resultImage = [UIImage imageWithCGImage:cgImage ]; CGImageRelease(cgImage); return resultImage; }else{ return nil; }
二、通过图像裁剪创建图像 CoreGraphics框架中提供了许多方法来创建位图数据引用CGImageRef对象,其中封装在CGImage.h文件中。 CGContextScaleCTM(contextRef, 1.0, -1.0); CGImageRef orignImage = [UIImage imageNamed:@"image"].CGImage CGContextScaleCTM(contextRef, 1.0, -1.0); CGImageRef orignImage = [UIImage imageNamed:@"image"].CGImage ; CGImageRef maskRef = [UIImage imageNamed:@"maskImage"].CGImage; //通过图片数据创建膜层 CGImageRef CGContextScaleCTM(contextRef, 1.0, -1.0); CGImageRef orignImage = [UIImage imageNamed:@"image2"].CGImage
: case UIImageOrientationRight: break; } // Now we draw the underlying CGImage self.size.width, self.size.height, CGImageGetBitsPerComponent(self.CGImage CGImageGetBitmapInfo(self.CGImage)); CGContextConcatCTM(ctx, transform); switch (self.imageOrientation CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage); default: CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage
: case UIImageOrientationRight: break; } // Now we draw the underlying CGImage self.size.width, self.size.height, CGImageGetBitsPerComponent(self.CGImage CGImageGetBitmapInfo(self.CGImage)); CGContextConcatCTM(ctx, transform); switch (self.imageOrientation CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage); default: CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage
createBlurBackground (image:UIImage,view:UIView,blurRadius:Float) { //处理原始NSData数据 let originImage = CIImage(CGImage : image.CGImage ) //创建高斯模糊滤镜 let filter = CIFilter(name: "CIGaussianBlur") filter.setValue CIImage let blurImage = UIImage(CGImage: context.createCGImage(result, fromRect: result.extent())
imageNamed:@"image/animation/gift_boat"]; CGSize sourceSize = sourceImage.size; CGImageRef cgimage = CGImageCreateWithImageInRect(sourceImage.CGImage, ]; CGImageRelease(cgimage); cgimage = CGImageCreateWithImageInRect(sourceImage.CGImage, ]; CGImageRelease(cgimage); cgimage = CGImageCreateWithImageInRect(sourceImage.CGImage, ]; CGImageRelease(cgimage); 动画剖析与时间轴 下面这个是一个全屏类型的“天使”礼物动画,我们来剖析下这个动画的构成。
譬如:CIImage(contentsOfURL:), CIImage(data:), CIImage(CGImage:), CIImage(bitmapData:bytesPerRow:size:format extent) // 3 将CGImage转换为UIImage let newImage = UIImage(CGImage: cgimg) self.imageView.image ALAssetsLibrary 提供了将CGImage直接保存到相册的示例方法:writeImageToSavedPhotosAlbum,只可惜它到iOS 9.0 就弃用了☹️,当工程的最低兼容版本大于 softwareContext = CIContext(options: [kCIContextUseSoftwareRenderer : true]) // 3 将CIImage转换为CGImage let cgimage = softwareContext.createCGImage(imageToSave, fromRect: imageToSave.extent)
特记录以下内容,整理自ios核心动画高级技巧 · GitBook (墙裂推荐阅读此翻译文档) contents 属性 这个属性的类型被定义为id(这是由于MacOSX历史原因造成的,因为在Mac中这个属性对CGImage UIImage *image = [UIImage imageNamed:@"demoImage"]; self.demoView.layer.contents = (__bridge id )(image.CGImage 当我们使用UIImage时,会获取高质量的图片,但CGImage没有拉伸概念,因此使用CGImage设置图片时,拉伸的因素会在转换的时候丢失,当用代码设置contents图片时,要手动设置图层的contentsScale image toView:(UIView *)toView withContentsRect:(CGRect)rect{ toView.layer.contents = (__bridge id)image.CGImage
cvMatWithImage:(UIImage *)image 2 { 3 CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage Bitmap info flags 17 18 CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); 41 42 // Creating CGImage kCGRenderingIntentDefault //intent 55 ); 56 57 // Getting UIImage from CGImage
只有赋CGImage的时候才能正确显示。 contents 这个奇怪的表现是由 Mac OS 的历史原因造成的,因为在 Mac OS 系统上,这个属性对 CGImage 和 NSImage 类型的值都起作用。 事实上,真正赋值的类型应该是CGImageRef,这是一个指向CGImage结构的指针。 因为CGImage和UIImage不一样,它没有拉伸的感念。用UIImage读取图片时,读取了高质量的Retina图片。 2.2 Custom Drawing 除了给contents赋值CGImage来设置寄宿图之外,还可以直接用Core Graphics来绘制寄宿图。
UIImage (Category)- (UIImage *)grayImage { CIImage *beginImage = [CIImage imageWithCGImage:self.CGImage 转换图片,创建基于GPU的CIContext对象 CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef cgImage ]; // 释放C对象 CGImageRelease(cgImage); return newImage;}- (UIImage *)anotherGrayImage { // 3:源文件(原图片)(说白了现在是一个C/C++的内存区域) CGContextDrawImage(context, CGRectMake(0, 0, width, height), self.CGImage ); //第四步:将绘制颜色空间转成CGImage(转成可识别图片类型) CGImageRef grayImageRef = CGBitmapContextCreateImage(context
CGSizeEqualToSize(size, CGSizeZero)) { image = [UIImage imageWithCGImage:image.CGImage scale colorSpace, kCGImageAlphaPremultipliedFirst); CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage ); CGContextDrawImage(context, CGRectMake(w - logoWidth, 0, logoWidth, logoHeight), [logo CGImage])
CGImageRef cgImage = image.CGImage; // alphaInfo CGImageAlphaInfo alphaInfo 绘制到上下文会触发解码 CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgImage); / / get CGImage cgImage = CGBitmapContextCreateImage(context); // into UIImage UIImage *newImage = [UIImage imageWithCGImage:cgImage]; // release CGContextRelease( context); CGImageRelease(cgImage); // back to the main thread dispatch_async
{ // 从view、data、CGImage获取BitmapImageRep // NSBitmapImageRep *bitmap = [NSBitmapImageRep imageRepWithData:data]; // NSBitmapImageRep *bitmap = [[[NSBitmapImageRep alloc] initWithCGImage:CGImage var imageRef: CGImage? = nil if(imageData ! 转 NSImage func getNSImageWithCGImageRef(imageRef: CGImage) -> NSImage? { return NSImage(cgImage: imageRef, size: NSSize(width: imageRef.width, height: imageRef.height