2013-10-21 83 views
3

研究,最後嘗試許多事情之後我自己問這樣:如何將UIImage(從照片庫中選取)渲染到CIContext/GLKView中?

基本上我想挑選一張,然後使它對一個CIcontext,知道許多其它的圖像渲染技術(如:使用UIImageView等),我必須使用低級的OpenGL ES渲染。

請查看我的完整代碼(除的UIImagePickerControllerAppDelegate預載)

#import "ViewController.h" 
#import "AppDelegate.h" 
#import <GLKit/GLKit.h> 

@interface ViewController() <GLKViewDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate> { 
    GLKView *glkview; 
    CGRect glkview_bounds; 
} 

- (IBAction)click:(id)sender; 
@property (strong, nonatomic) EAGLContext *eaglcontext; 
@property (strong, nonatomic) CIContext *cicontext; 
@end 

@implementation ViewController 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.eaglcontext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
    glkview = [[GLKView alloc] initWithFrame:[[UIScreen mainScreen] bounds] context:self.eaglcontext]; 
    glkview.drawableDepthFormat = GLKViewDrawableDepthFormat24; 
    glkview.enableSetNeedsDisplay = YES; 
    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_bounds:%@", NSStringFromCGRect(glkview_bounds)); 

    self.cicontext = [CIContext contextWithEAGLContext:self.eaglcontext options:@{kCIContextWorkingColorSpace : [NSNull null]} ]; 
    UIAppDelegate.g_mediaUI.delegate = self; 
} 

- (IBAction)click:(id)sender { 
    [self presentViewController:UIAppDelegate.g_mediaUI animated:YES completion:nil]; 
} 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    [self dismissViewControllerAnimated:NO completion:nil]; 

    UIImage *pre_img = (UIImage *)[info objectForKey:UIImagePickerControllerOriginalImage]; 
    CIImage *outputImage = [CIImage imageWithCGImage:pre_img.CGImage]; 

    NSLog(@"orient:%d, size:%@, scale:%f, extent:%@", (int)pre_img.imageOrientation, NSStringFromCGSize(pre_img.size), pre_img.scale,NSStringFromCGRect(outputImage.extent)); 

    if (outputImage) { 
     if (self.eaglcontext != [EAGLContext currentContext]) 
      [EAGLContext setCurrentContext:self.eaglcontext]; 
     // clear eagl view to grey 
     glClearColor(0.5, 0.5, 0.5, 1.0); 
     glClear(GL_COLOR_BUFFER_BIT); 
     // set the blend mode to "source over" so that CI will use that 
     glEnable(GL_BLEND); 
     glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
     [self.cicontext drawImage:outputImage inRect:glkview_bounds fromRect:[outputImage extent]]; 
     [glkview display]; 
    } 
} 

@end 

什麼工作:挑選有大小如圖像。顯示大小1390x1390或1440x1440。

什麼不起作用:所選大小爲2592x1936的圖像未顯示,基本上都是用相機拍攝的所有大圖。

請幫忙找出解決辦法,我在這裏stucked ...

+0

得到了什麼解決方案? –

+0

可悲的是..我嘗試了很多變化。我也看到了關於這個主題的WWDC會議,但是它的源代碼沒有發佈(可能還有)..它是wwdc2012/511:核心圖像技術。我檢查了源代碼dmg,但它沒有包含會話511源代碼... – zZzZ

+0

此解決方案無法在ios 10.2上工作 – khunshan

回答

1

的OpenGL有紋理的限制,根據不同的iOS設備它可以在2048×2048。 您可以查看最大紋理限制使用下面的代碼的設備:

static GLint maxTextureSize = 0; 
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); 

舊的手機(之前iPhone 4S)都具有2048×2048的最大紋理大小。 A5及以上(包括iPhone 4S在內)擁有最大4096x4096紋理尺寸。

來源:Black texture with OpenGL when image is too big

+0

在我的iPhone4上測試過,它記錄了2048年。所以這意味着實際上在渲染到我的cicontext ,我必須用例如縮小它。 LanczosFilter(CILanczosScaleTransform)? – nzs

+0

是的,將其縮小到允許範圍內的大小。你也可以將它們分成幾塊並分別繪製,但這可能比它的價值更加重要。 – gabriellanata

+0

在幾乎所有情況下,te OpenGL紋理尺寸限制都大於設備的屏幕。 – gabriellanata

相關問題