3

多くのことを調査して試した後、最終的に私はSOに尋ねるようになりました:

基本的に私は写真を選んでそれを CIcontextにレンダリングしたいと思います.他の多くの画像レンダリング技術が利用可能であることを知っています (例: useUIImageViewなど), 低レベルの OpenGL ES レンダリングを使用する必要があります.

私の完全なコードを確認してください( in のプリロードをUIImagePickerController除くAppDelegate

#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 のサイズの選択された画像は表示されません。基本的に、カメラで撮影したすべての大きな写真です。

解決策を見つけるのを手伝ってください、私はここで立ち往生しています...

4

1 に答える 1

1

OpenGL にはテクスチャの制限があり、iOS デバイスによっては 2048x2048 になる場合があります。次のコードを使用して、デバイスの最大テクスチャ制限を確認できます。

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

古いデバイス (iPhone 4S より前) のテクスチャの最大サイズはすべて 2048x2048 です。A5 以上 (iPhone 4S 以降) のテクスチャ サイズは最大 4096x4096 です。

出典:画像が大きすぎる場合の OpenGL による黒いテクスチャ

于 2013-10-30T22:55:17.663 に答える