Iphone 如何将UIImage(从照片库中拾取)渲染到CIContext/GLKView?

Iphone 如何将UIImage(从照片库中拾取)渲染到CIContext/GLKView?,iphone,xcode,uiimage,core-image,glkview,Iphone,Xcode,Uiimage,Core Image,Glkview,在研究和尝试了许多事情之后,我终于问自己: 基本上,我想选择一张照片,然后将其渲染到CIcontext,因为我知道许多其他可用的图像渲染技术(例如使用UIImageView等),我必须使用低级OpenGL ES渲染 请检查我的完整代码(除了AppDelegate中的UIImagePickerController预加载) #导入“ViewController.h” #导入“AppDelegate.h” #进口 @界面视图控制器(){ GLKView*GLKView; CGRect glkview_

在研究和尝试了许多事情之后,我终于问自己:

基本上,我想选择一张照片,然后将其渲染到CIcontext,因为我知道许多其他可用的图像渲染技术(例如使用
UIImageView
等),我必须使用低级OpenGL ES渲染

请检查我的完整代码(除了
AppDelegate
中的
UIImagePickerController
预加载)

#导入“ViewController.h”
#导入“AppDelegate.h”
#进口
@界面视图控制器(){
GLKView*GLKView;
CGRect glkview_界;
}
-(iAction)单击:(id)发件人;
@属性(强,非原子)EAGLContext*EAGLContext;
@属性(强,非原子)CIContext*CIContext;
@结束
@实现视图控制器
-(无效)viewDidLoad{
[超级视图下载];
self.eaglcontext=[[eaglcontext alloc]initWithAPI:keagrenderingapiopengles2];
glkview=[[glkview alloc]initWithFrame:[[UIScreen mainScreen]边界]上下文:self.eaglcontext];
glkview.drawableDepthFormat=GLKViewDrawableDepthFormat24;
glkview.enableSetNeedsDisplay=是;
glkview.delegate=self;
[self.view addSubview:glkview];
[glkview bindDrawable];
glkview_bounds=CGRectZero;
glkview_bounds.size.width=glkview.drawableWidth;
glkview_bounds.size.height=glkview.drawableHeight;
NSLog(@“glkview_边界:%@),NSStringFromCGRect(glkview_边界));
self.cicontext=[cicontext ContextWithEagleContext:self.EagleContext选项:@{kCIContextWorkingColorSpace:[NSNull]}];
UIAppDelegate.g_mediaUI.delegate=self;
}
-(iAction)单击:(id)发件人{
[self-presentViewController:UIAppDelegate.g_mediaUI动画:是完成:无];
}
-(void)imagePickerController:(UIImagePickerController*)picker未使用信息完成PickingMediaWithInfo:(NSDictionary*)信息{
[自我解除视图控制器激活:未完成:无];
UIImage*pre_img=(UIImage*)[info objectForKey:UIImagePickerControllerOriginalImage];
CIImage*outputImage=[CIImage-imageWithCGImage:preimg.CGImage];
NSLog(@“方向:%d,大小:%@,比例:%f,范围:%@),(int)pre_img.imageOrientation,NSStringFromCGSize(pre_img.size),pre_img.scale,NSStringFromCGRect(outputImage.extent));
如果(输出图像){
if(self.eaglcontext!=[eaglcontext currentContext])
[EAGLContext setCurrentContext:self.EAGLContext];
//将eagl视图清除为灰色
glClearColor(0.5,0.5,0.5,1.0);
glClear(GLU颜色缓冲位);
//将混合模式设置为“源代码结束”,以便CI将使用该模式
glEnable(GL_混合物);
glBlendFunc(GL_ONE,GL_ONE减去SRC_ALPHA);
[self.cicontext drawImage:OutputImageInRect:glkview_bounds fromRect:[OutputImageExtent];
[glkview显示];
}
}
@结束
工作原理:显示大小为1390x1390或1440x1440的拾取图像

不起作用的地方:不显示拾取的2592x1936大小的图像,基本上是使用相机拍摄的所有大型照片


请帮助找出解决方案,我在这里被绊住了…

OpenGL有一个纹理限制,取决于iOS设备,它可以是2048x2048。 您可以使用以下代码检查设备的最大纹理限制:

static GLint maxTextureSize = 0;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
旧设备(iPhone 4S之前)的最大纹理大小均为2048x2048。A5及以上(iPhone 4S之后及之后)的最大纹理大小为4096x4096


资料来源:

很遗憾,没有。。我尝试了太多的变化。我还看到了一个关于这个主题的WWDC会议,但是它的源代码还没有发布(可能还没有发布)。。它是wwdc2012/511:核心图像技术。我已经检查了源代码dmg,但它不包含会话511源代码…此解决方案在我的iPhone4上测试的ios 10.2上不起作用,它记录了2048。这实际上意味着,在我渲染cicontext之前,我必须使用LanczosFilter(CilanczosCaleTransform)将其缩小?是的,将其缩小到允许范围内的大小。你也可以把它切成小块,然后分别画出来,但这可能比它的价值更大。在几乎所有情况下,OpenGL的纹理大小限制都比设备的屏幕大。通过各种大小的测试,是的,问题是纹理大小限制。谢谢你!
static GLint maxTextureSize = 0;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);