2010-10-31 4 views
0

en conséquence à certaines valeurs UIColor à partir d'un contexte de vues de défilement Je souhaite modifier les valeurs de pixels rgb pour plusieurs UIImages que je souhaite superposer par la suite. Au moins j'ai 4 images que je voudrais superposer, une image de fond qui est statique et 3 images de couche dont les informations de pixels que je voudrais changer avant de superposer tous ensemble. Le problème avec lequel je me bats est que les UIImages sont mal colorées. Je me souviens d'un endroit où j'ai lu quelque chose à propos des difficultés concernant les problèmes de filetage. Mais je ne suis pas sûr que ce soit le même problème dans mon code:Problèmes liés à la superposition de différentes UIImages

La méthode scrollViewDidEndDecelerating delegate prend les 3 images de couche et les passe à la méthode qui change la couleur des pixels.

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
MyViewController *controller = [scrollViewControllers objectAtIndex:currentScrollViewPage]; 
int color1 = [self getIntFromUIColor:controller.view1.backgroundColor]; 
int color2 = [self getIntFromUIColor:controller.view2.backgroundColor]; 
int color3 = [self getIntFromUIColor:controller.view3.backgroundColor]; 
UIImage *bgImage = [UIImage imageName:@"bg.png"]; 


    //pass the overlay images to the coloring method 
    //I suppose my problem to be here 
UIImage *layer1 = [self convertImage:[UIImage imageName:@"layer1.png"] withColor:color1]; 
UIImage *layer2 = [self convertImage:[UIImage imageName:@"layer2.png"] withColor:color2]; 
UIImage *layer3 = [self convertImage:[UIImage imageName:@"layer3.png"] withColor:color3]; 

CGSize sizeBG = bgImage.size; 

CGRect bgBoundingBox = CGRectMake (0, 0, sizeBG.width,sizeBG.height); 

CGContextRef myBitmapContext = [self createBitmapContextOfSize:sizeBG]; 

    //here I'd like to overlay the images 
    CGContextDrawImage(myBitmapContext, bgBoundingBox, bgImage.CGImage); 
CGContextDrawImage(myBitmapContext, bgBoundingBox, layer1.CGImage); 
CGContextDrawImage(myBitmapContext, bgBoundingBox, layer2.CGImage); 
CGContextDrawImage(myBitmapContext, bgBoundingBox, layer3.CGImage); 

UIImage *result = [UIImage imageWithCGImage: CGBitmapContextCreateImage (myBitmapContext)]; 

CGContextRelease (myBitmapContext); 
    //finally paint the result on the imageView 
imageView.image = result; 

} 

cette méthode suivante obtient la UIImage et la couleur:

-(void) convertImage:(UIImage *)src_img withColor:(int)color 
{ 
[src_img retain]; 

    CGColorSpaceRef d_colorSpace = CGColorSpaceCreateDeviceRGB(); 
    /* 
    * Note we specify 4 bytes per pixel here even though we ignore the 
    * alpha value; you can't specify 3 bytes per-pixel. 
    */ 
    int height = src_img.size.height; 
    size_t d_bytesPerRow = src_img.size.width * 4; 
    unsigned int * imgData = (unsigned int*)malloc(src_img.size.height*d_bytesPerRow); 

    CGContextRef context = CGBitmapContextCreate(imgData, src_img.size.width, 
       src_img.size.height, 
       8, d_bytesPerRow, 
       d_colorSpace, 
       kCGImageAlphaPremultipliedLast); 

    UIGraphicsPushContext(context); 
    // These next two lines 'flip' the drawing so it doesn't appear upside-down. 
    CGContextTranslateCTM(context, 0.0, src_img.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    // Use UIImage's drawInRect: instead of the CGContextDrawImage function, otherwise you'll have issues when the source image is in portrait orientation. 
    [src_img drawInRect:CGRectMake(0.0, 0.0, src_img.size.width, src_img.size.height)]; 
    UIGraphicsPopContext(); 

    //swap colors 
    int red = (color & 0xff0000) >> 16; 
    int green = (color & 0xff00) >> 8; 
    int blue = (color & 0xff); 
    int colorShifted = (blue << 16) + (green << 8) + red; 

      //in this function the pixels are manipulated 
    colorChanger((int *)imgData,(src_img.size.height * src_img.size.width),colorShifted); 

    // After we've processed the raw data, turn it back into a UIImage instance. 
    CGImageRef new_img = CGBitmapContextCreateImage(context); 
    UIImage * convertedImage = [[[UIImage alloc] initWithCGImage: 
      new_img] autorelease]; 


    CGImageRelease(new_img); 
    CGContextRelease(context); 
    CGColorSpaceRelease(d_colorSpace); 
    free(imgData); 
    [src_img release]; 

      return convertedImage; 

}

Toute aide serait appréciée. La fonction changeColor fonctionne bien au calme. Quand je change seulement la couleur d'une seule couche, le résultat semble bon. Mais changer les couleurs de tous les 3 couches en même temps principalement layer2 et layer3 est peint avec color3 et layer1 est peint avec color2. Merci pour votre aide ...

Répondre

0

Pendant ce temps je parvins le problème en changeant l'ordre de dessin à partir de:

CGContextDrawImage(myBitmapContext, bgBoundingBox, bgImage.CGImage); 
CGContextDrawImage(myBitmapContext, bgBoundingBox, layer1.CGImage); 
CGContextDrawImage(myBitmapContext, bgBoundingBox, layer2.CGImage); 
CGContextDrawImage(myBitmapContext, bgBoundingBox, layer3.CGImage); 

à

CGContextDrawImage(myBitmapContext, bgBoundingBox, bgImage.CGImage); 
CGContextDrawImage(myBitmapContext, bgBoundingBox, layer3.CGImage); 
CGContextDrawImage(myBitmapContext, bgBoundingBox, layer2.CGImage); 
CGContextDrawImage(myBitmapContext, bgBoundingBox, layer1.CGImage); 

Mais cela n'a pas de sens pour moi du tout , parce que je ne vois pas de connexion concernant l'ordre de dessin et les disparités de couleur lorsque j'utilise un autre ordre de dessin ...

Questions connexes