如何在iPhone上调整多个UIImageVIews的色调?

问题描述:

我碰到原本看起来应该是一个非常简单的问题,但花了很多很多小时试图找出并得到无处。如何在iPhone上调整多个UIImageVIews的色调?

我正在使用Apple的GLImageProcessing示例代码,并将其简化为显示一个带有调整图像色调的UISlider的EAGLView。我修改了EAGLView从UIImageView继承,这样我就可以更多地控制显示的图像。这工作正常。当我尝试在屏幕上添加第二个图像时出现问题。理想情况下,我想要显示背景图像和其他几张图像,并使色相滑块同时更改所有这些图像的色调。但是,当我尝试向屏幕添加第二个图像时,第一个图像变成纯黑色视图,而当我移动滑块时,实际上会变成紫色阴影,但无法响应。新视图的功能如预期。如果我要添加第三个,前两个将不起作用,而第三个将正常工作。

我想我想要做的是有一个EAGLView并为新图像添加纹理,但似乎没有任何工作。任何帮助指出我在正确的方向将不胜感激。谢谢!

从ViewController.h。代码在viewDidLoad方法中添加新的EAGLView子视图。还有已经在笔尖加载另一种观点认为:

- (void)viewDidLoad 
{ 

    UIImage *img = [UIImage imageNamed:@"Image.png"]; 
    EAGLView *newView = [[EAGLView alloc] initWithImage:img texID:0]; 
    self.view2 = newView; 
    self.view2.frame = CGRectMake(110, 110, 100, 100); 
    [self.view addSubview:self.view2]; 
    [newView release]; 

} 

和简单IBAction为价值解雇更改:

- (void)sliderAction:(id)sender 
{ 
    [self.imageView drawViewWithSliderValue:self.slider.value]; 
    [self.view2 drawViewWithSliderValue:self.slider.value]; 
} 

从EAGLView.h,这是EAGLView初始化代码和抽奖代码。这几乎是一样的示例代码,但它可以让你通过图像到initGL:

-(id) initializeEAGLwithTexID:(int)texID{ 
    // Get the layer 
    CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; 
    eaglLayer.opaque = YES; 
    eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: 
              [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, 
              kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, 
              nil]; 

    context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];   
    if (!context || ![EAGLContext setCurrentContext:context]) 
    { 
      [self release]; 
      return nil; 
    } 

    // Create system framebuffer object. The backing will be allocated in -reshapeFramebuffer 
    glGenFramebuffersOES(1, &viewFramebuffer[texID]); 
    glGenRenderbuffersOES(1, &viewRenderbuffer[texID]); 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer[texID]); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer[texID]); 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer[texID]); 

    // Perform additional one-time GL initialization 
    UIImage *myImage = self.image; 
    NSLog(@"holding image of width: %f height %f", myImage.size.width, myImage.size.height); 
    CGImageRef imageRef = myImage.CGImage; 
    initGL(imageRef, texID); 
    return self; 
} 

-(id) initWithImage:(UIImage *)image texID:(int)texID{ 
    if((self = [super initWithImage:image])){ 
      self.opaque = YES; 
      self.contentMode = UIViewContentModeScaleToFill; 
      [self initializeEAGLwithTexID:texID]; 

    } 
    return self; 
} 

- (void)drawViewWithSliderValue:(float)value; 
{ 
    drawGL(backingWidth, backingHeight, value, currentID); 
    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
} 

从Imaging.c的initGL代码和drawGL。我修改了处理数组以处理多个纹理的代码。我比较肯定一堆在这里创建是不必要的数组,但由于他们没有伤害任何东西,也没有试图消除任何尚未:

void initGL(CGImageRef myImage, int currID) 
{ 
    int i; 

    // Query renderer capabilities that affect this app's rendering paths 
    renderer[currID].extension[APPLE_texture_2D_limited_npot] = 
      (0 != strstr((char *)glGetString(GL_EXTENSIONS), "GL_APPLE_texture_2D_limited_npot")); 
    renderer[currID].extension[IMG_texture_format_BGRA8888] = 
      (0 != strstr((char *)glGetString(GL_EXTENSIONS), "GL_IMG_texture_format_BGRA8888")); 

    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &renderer[currID].maxTextureSize); 

    // Constant state for the lifetime of the app-- position and unit0 are always used 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glEnable(GL_TEXTURE_2D); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

    // Load image into texture 
    loadTexture(myImage, &Input[currID], &renderer[currID], currID); 

    // Modify quad texcoords to match (possibly padded) image 
    for (i = 0; i < 4; i++) 
    { 
      fullquad[i].s *= Input[currID].s; 
      fullquad[i].t *= Input[currID].t; 
      flipquad[i].s *= Input[currID].s; 
      flipquad[i].t *= Input[currID].t; 
    } 

    // Create 1x1 for default constant texture 
    // To enable a texture unit, a valid texture has to be bound even if the combine modes do not access it 
    GLubyte half[3][4] = {{ 0x80, 0x80, 0x80, 0x80 },{ 0x80, 0x80, 0x80, 0x80 },{ 0x80, 0x80, 0x80, 0x80 }}; 
    glActiveTexture(GL_TEXTURE1); 


    glGenTextures(1, &Half[currID].texID); 
    Half[currID].wide = Half[currID].high = 1; 
    Half[currID].s = Half[currID].t = 1.0; 
    glBindTexture(GL_TEXTURE_2D, Half[currID].texID); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 


    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, half[currID]); 
    glActiveTexture(GL_TEXTURE0); 

    // Remember the FBO being used for the display framebuffer 
    glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, (GLint *)&SystemFBO[currID]); 

    // Create scratch textures and FBOs 
    glGenTextures(1, &Degen[currID].texID); 
    Degen[currID].wide = Input[currID].wide; 
    Degen[currID].high = Input[currID].high; 
    Degen[currID].s = Input[currID].s; 
    Degen[currID].t = Input[currID].t; 
    glBindTexture(GL_TEXTURE_2D, Degen[currID].texID); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Degen[currID].wide, Degen[currID].high, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
    glGenFramebuffersOES(1, &DegenFBO[currID]); 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, DegenFBO[currID]); 
    glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, Degen[currID].texID, 0); 

    glGenTextures(1, &Scratch[currID].texID); 
    Scratch[currID].wide = Input[currID].wide; 
    Scratch[currID].high = Input[currID].high; 
    Scratch[currID].s = Input[currID].s; 
    Scratch[currID].t = Input[currID].t; 
    glBindTexture(GL_TEXTURE_2D, Scratch[currID].texID); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Scratch[currID].wide, Scratch[currID].high, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
    glGenFramebuffersOES(1, &ScratchFBO[currID]); 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, ScratchFBO[currID]); 
    glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, Scratch[currID].texID, 0); 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, SystemFBO[currID]); 
} 

void drawGL(int wide, int high, float val, int currID) 
{ 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrthof(0, wide, 0, high, -1, 1); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glScalef(wide, high, 1); 

    glBindTexture(GL_TEXTURE_2D, Input[currID].texID); 

    // Render filtered image to system framebuffer 
    glViewport(0, 0, wide, high); 

    hue(flipquad, val); 

} 

也许iPhone OS只支持一个Open GL的观点在时间?

+0

看来iPhone OS只支持EAGLView的一个实例。但是,它应该允许编辑多个图像,也许通过使用多个纹理? – 2010-08-18 15:44:20