zl程序教程

您现在的位置是:首页 >  云平台

当前栏目

封装CIImage实现实时渲染

封装实时 实现 渲染
2023-09-14 08:57:58 时间
#pragma mark - 可读写属性 @property (nonatomic, strong, readwrite) CIImage *inputCIImage; // 输入CIImage @property (nonatomic, strong, readwrite) NSString *filterName; // 滤镜名字
#pragma mark - 重写了getter方法,注意 @property (nonatomic, strong, readonly) CIImage *outputCIImage; // 输出CIImage @property (nonatomic, assign, readonly) BOOL filterNameValid; // 滤镜名合法性
- (instancetype)initWithFilterName:(NSString *)filterName; - (instancetype)initWithFilterName:(NSString *)filterName inputCIImage:(CIImage *)inputCIImage;
@synthesize outputCIImage = _outputCIImage; @synthesize filterNameValid = _filterNameValid; + (void)initialize if (self == [ImageFilter class]) filterNameArray = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];; - (instancetype)init return [self initWithFilterName:nil inputCIImage:nil]; - (instancetype)initWithFilterName:(NSString *)filterName return [self initWithFilterName:filterName inputCIImage:nil]; - (instancetype)initWithFilterName:(NSString *)filterName inputCIImage:(CIImage *)inputCIImage self = [super init]; if (self) self.filterName = filterName; self.inputCIImage = inputCIImage; return self; -(CIImage *)outputCIImage if (_filter) return [_filter outputImage]; else return nil; - (void)configFilter:(ImageFilterConfigBlock_t)block if (_filterName _inputCIImage) // 创建滤镜 _filter = [CIFilter filterWithName:_filterName keysAndValues:kCIInputImageKey, _inputCIImage, nil]; // 设置滤镜 block(_filter); block(nil); - (BOOL)filterNameValid BOOL flag = NO; if (_filterName) for (NSString *name in filterNameArray) if ([_filterName isEqualToString:name] == YES) flag = YES; break; return flag; @end
ImageRender.h + ImageRender.m
//

// ImageRender.h

// CoreImageWapper

// Copyright (c) 2014年 Y.X. All rights reserved.

#import Foundation/Foundation.h 

#import "ImageFilter.h"

@interface ImageRender : NSObject


@property (nonatomic, strong) ImageFilter *imageFilter; @property (nonatomic, strong) UIImage *outputImage;
CGImageRef cgImage = [_context createCGImage:outputCIImage fromRect:[outputCIImage extent]]; self.outputImage = [UIImage imageWithCGImage:cgImage]; CGImageRelease(cgImage); return self.outputImage; @end

现在,你可以这么使用了:)

好吧,来一个复杂的看看,即时渲染:

- (void)viewDidLoad

 [super viewDidLoad];

 ImageFilter *filter = [ImageFilter new];

 ImageRender *render = [ImageRender new];

 filter.filterName = @"CIPixellate";

 filter.inputCIImage = CIImageFromImage([UIImage imageNamed:@"demo"]);

 [filter configFilter:^(CIFilter *filter) {

 [filter setValue:@1

 forKey:@"inputScale"];

 render.imageFilter = filter;

 UIImageView *imageView = [[UIImageView alloc] initWithImage:[render render]];

 [self.view addSubview:imageView];

 imageView.center = self.view.center;

 _timer = [[GCDTimer alloc] initInQueue:[GCDQueue globalQueue]];

 [_timer event:^{

 static int i = 1;

 [filter configFilter:^(CIFilter *filter) {

 [filter setValue:[NSNumber numberWithInt:(i++)%10 + 1]

 forKey:@"inputScale"];

 render.imageFilter = filter;

 [[GCDQueue mainQueue] execute:^{

 imageView.image = [render render];

 } timeInterval:NSEC_PER_SEC/10.f];

 [_timer start];

}


- (void)viewDidLoad

 [super viewDidLoad];

 ImageFilter *filter = [ImageFilter new];

 ImageRender *render = [ImageRender new];

 filter.filterName = @"CIHueAdjust";

 filter.inputCIImage = CIImageFromImage([UIImage imageNamed:@"demo"]);

 [filter configFilter:^(CIFilter *filter) {

 [filter setValue:@(3.14f)

 forKey:@"inputAngle"];

 render.imageFilter = filter;

 UIImageView *imageView = [[UIImageView alloc] initWithImage:[render render]];

 [self.view addSubview:imageView];

 imageView.center = self.view.center;

 _timer = [[GCDTimer alloc] initInQueue:[GCDQueue globalQueue]];

 [_timer event:^{

 static int i = 0;

 [filter configFilter:^(CIFilter *filter) {

 [filter setValue:[NSNumber numberWithFloat:(i+=1)%314/100.f]

 forKey:@"inputAngle"];

 render.imageFilter = filter;

 [[GCDQueue mainQueue] execute:^{

 imageView.image = [render render];

 } timeInterval:NSEC_PER_SEC/60.f];

 [_timer start];

}

附录:

https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/Reference/reference.html#//apple_ref/doc/uid/TP40004346

https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html

https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/CoreImaging/CoreImage.pdf

http://www.rapidsnail.com/Tutorial/t/2012/112/30/22766/the-coreimage-ios.aspx

http://www.raywenderlich.com/zh-hans/24773/%E5%88%9D%E5%AD%A6ios6-%E4%B8%AD%E7%9A%84core-image%E6%8A%80%E6%9C%AF

http://my.safaribooksonline.com/book/video/9780321637031/chapter-15dot-secret-patches-core-image-filters-and-glsl-pushing-the-boundaries/ch15sec1lev5

http://stackoverflow.com/questions/17041669/creating-a-blurring-overlay-view/17041983#17041983

 

 

 


1分钟解读什么是实时渲染 点量云实时渲染系统通过将3D模型放在服务器上,通过实时渲染技术流化出网页地址,让用户可以在网页上直接和3D模型交互实时渲染,让用户像看视频一样看到交互的实时效果。举个简单的例子,在智慧城市、园区等3D模型中,常用的有天气变化、白昼交替。用户在点了不同的季节或者天气(雨雪风电)等按钮后,就可以在网页里直接看到模型在相应场景下的效果。
【前端相关】服务端渲染和客户端渲染的比较 用传统的servlet开发来举例:浏览器请求servlet,servlet在服务端生成html响应给浏览器,浏览器展示html 的内容,这个过程就是服务端渲染。 当初随着web2.0的到来,AJAX技术兴起,出现了客户端渲染:客户端(浏览器) 使用AJAX向服务端发起http请求,获取到了想要的数据,客户端拿着数据开始渲染html网页,生成Dom元素,并最终将网页内容展示给用户。
浅谈点量云实时渲染和像素流的六点区别 点量云实时渲染和像素流有哪些不同?主要从以下方面展开:1、兼容性2、可云流化程序类型3、实时渲染支持显卡和多服务器负载均衡而像素流技术不支持4、云流化支持网页和客户端交互方式和支持终端类型更多5、点量云实时渲染系统共有可视化后台和运营数据展示报表6、支持会议模式和音视频功能
实时渲染流程操作复杂吗,如何实现? 像素流技术需要自己来完成这个过程的搭建,还需要在实际应用中的多并发、负载均衡、在不同设备浏览器等下的兼容性、画面的多清晰度展示等等其他问题。点量云实时渲染4步操作,小白也可轻松实现3D应用的实时渲染流化传输。
实时渲染和预渲染有什么区别 实时渲染用于交互式渲染场景,如在3D电脑游戏中,通常每帧必须在几毫秒内渲染。它的意思是计算机在计算屏幕的同时输出和显示屏幕。典型代表是Unreal和Unity。像《黑色神话:悟空》这样的游戏便是使用虚幻引擎4创造出来的。实时绘制的特点是可以实时控制,交互非常方便。
27 个前端动画库让你的交互更加炫酷 很多时候我们在开发前端页面时都会做一些动画效果来提升用户体验度和页面美观度,所以今天就来给大家推荐几个好用的JavaScript动画库,希望对各位小伙伴有所帮助!
浅析WebRtc中视频数据的接收和渲染流程 本文基于PineAppRtc开源项目github.com/thfhongfeng… 因为一个需求,我们需要将WebRtc发送过来的视频流中转出去,所以就研究一下WebRtc是如何接收视频数据并进行处理渲染的,于是有了这篇文章。