由于CGContext中的重叠,显示不适当的图像

时间:2013-08-14 09:04:42

标签: iphone ios ipad

This is when the two images frame just overlap . Actual color is same when these images are separated ![][1]我无法找到解决方案:

我有两张不同图像的图像 - image_1(人物牛仔裤)和image_2(人物衬衫)。现在,当我为image_1或image_2的每个像素单独更改RGB值时,我得到了完美的结果。但无论何时我的两个框架中的一个,在处理它们之后与其他框架略有重叠,那么问题就出现了。请帮忙。这就是我处理图像的方式。

-(UIImage *)ColorChangeProcessing :(int )redvalue greenValue:(int)greenvalue blueValue:(int)bluevalue imageUsed : (UIImage *)image
{

    CGContextRef ctx;
    CGImageRef imageRef = [image CGImage];
    NSUInteger width = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char *rawData = malloc(height * width * 4);
    NSUInteger bytesPerPixel = 4;
    NSUInteger bytesPerRow = bytesPerPixel * width;
    NSUInteger bitsPerComponent = 8;
    CGContextRef context = CGBitmapContextCreate(rawData, width, height,
                                                 bitsPerComponent, bytesPerRow, colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
    CGContextRelease(context);


    int byteIndex = (bytesPerRow * 0) + 0 * bytesPerPixel,RED = redvalue,GREEN=greenvalue,BLUE = bluevalue;


    for (int ii = 0 ; ii < width * height ; ++ii)
    {
        if(rawData[byteIndex] != '/0' || rawData[byteIndex+1] != '/0' || rawData[byteIndex+2] != '/0'){


            if ((((rawData[byteIndex])+RED)) > 255)
            {
                rawData[byteIndex] = (char)255;
            }
            else if((((rawData[byteIndex])+RED)) >0)
            {
                rawData[byteIndex] = (char) (((rawData[byteIndex] * 1.0) + RED));
                           }
            else
            {
                rawData[byteIndex] = (char)0;
            }


            if ((((rawData[byteIndex+1])+GREEN)) > 255)
            {
                rawData[byteIndex+1] = (char)255;
            }
            else if((((rawData[byteIndex+1])+GREEN))>0)
            {
                rawData[byteIndex+1] = (char) (((rawData[byteIndex+1] * 1.0) + GREEN));


            }
            else
            {
                rawData[byteIndex+1] = (char)0;
            }



            if ((((rawData[byteIndex+2])+BLUE)) > 255)
            {
                rawData[byteIndex+2] = (char)255;
            }
            else if((((rawData[byteIndex+2])+BLUE))>0)
            {
                rawData[byteIndex+2] = (char) (((rawData[byteIndex+2] * 1.0) + BLUE));


            }
            else
            {
                rawData[byteIndex+2] = (char)0;
            }




        }


        byteIndex += 4;
    }

    ctx = CGBitmapContextCreate(rawData,
                                CGImageGetWidth( imageRef ),
                                CGImageGetHeight( imageRef ),
                                8,
                                CGImageGetBytesPerRow( imageRef ),
                                CGImageGetColorSpace( imageRef ),
                                kCGImageAlphaPremultipliedLast );

    CGImageRef NewimageRef = CGBitmapContextCreateImage (ctx);
    UIImage* rawImage = [UIImage imageWithCGImage:NewimageRef];

    CGContextRelease(ctx);


    free(rawData);
    CGImageRelease(NewimageRef);


    return rawImage;

}

现在开启任何按钮操作,您可以设置R,G,B&amp;图像值,然后获取处理后的图像。然后尝试放置那些处理过的图像帧,以便一个图像的某些部分被另一个图像覆盖。意味着如果你有牛仔裤形象只是试图将小部分放在腰带附近的衬衫图像上。

1 个答案:

答案 0 :(得分:1)

最后,我提出了我缺少的解决方案来检查alpha值。因此透明图像部分是产生问题的部分。谢谢大家。