目标C在另一个图像上添加透明背景的照片

时间:2016-05-04 21:44:52

标签: ios objective-c image image-processing

我正在尝试在当前图片上添加透明背景的图像。我有以下代码:

#pragma mark - Private

#define Mask8(x) ( (x) & 0xFF )
#define R(x) ( Mask8(x) )
#define G(x) ( Mask8(x >> 8 ) )
#define B(x) ( Mask8(x >> 16) )
#define A(x) ( Mask8(x >> 24) )
#define RGBAMake(r, g, b, a) ( Mask8(r) | Mask8(g) << 8 | Mask8(b) << 16 | Mask8(a) << 24 )
// Overlays a picture over top of the current image
- (void)addPictureWithTransparencies:(UIImage*)transparentImage :(CGPoint *)point {

    // 1. Get the raw pixels of the image
    UInt32 * imgPixels;

    CGImageRef imgCGImage = [self.mainImage.image CGImage];
    NSUInteger imgWidth = CGImageGetWidth(imgCGImage);
    NSUInteger imgHeight = CGImageGetHeight(imgCGImage);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    NSUInteger bytesPerPixel = 4;
    NSUInteger bitsPerComponent = 8;

    NSUInteger imgBytesPerRow = bytesPerPixel * imgWidth;

    imgPixels = (UInt32 *)calloc(imgHeight * imgWidth, sizeof(UInt32));

    CGContextRef context = CGBitmapContextCreate(imgPixels, imgWidth, imgHeight,
                                                 bitsPerComponent, imgBytesPerRow, colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

    CGContextDrawImage(context, CGRectMake(0, 0, imgWidth, imgHeight), imgCGImage);

    CGImageRef transparentCGImage = [transparentImage CGImage];

    NSUInteger transparentWidth = CGImageGetWidth(transparentCGImage);
    NSUInteger transparentHeight = CGImageGetHeight(transparentCGImage);
    CGPoint transparentOrigin = CGPointMake(point->x, point->y);

    NSUInteger transparentBytesPerRow = bytesPerPixel * transparentWidth;
    UInt32 * transparentPixels = (UInt32 *)calloc(transparentWidth * transparentHeight, sizeof(UInt32));

    CGContextRef transparentContext = CGBitmapContextCreate(transparentPixels, transparentWidth, transparentHeight,
                                                            bitsPerComponent, transparentBytesPerRow, colorSpace,
                                                            kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGContextDrawImage(transparentContext, CGRectMake(0, 0, transparentWidth, transparentHeight),transparentCGImage);


    NSUInteger offsetPixelCountForInput = transparentOrigin.y * imgWidth + transparentOrigin.x;
    for (NSUInteger j = 0; j < transparentHeight; j++) {
        for (NSUInteger i = 0; i < transparentWidth; i++) {
            UInt32 * imgPixel = imgPixels + j * imgWidth + i + offsetPixelCountForInput;
            UInt32 imgColor = *imgPixel;

            UInt32 * transparentPixel = transparentPixels + j * (int)transparentWidth + i;
            UInt32 transparentColor = *transparentPixel;

            // Do some processing here
            // Blend the ghost with 100% alpha
            CGFloat transparentAlpha = 1.0f * (A(transparentColor) / 255.0);
            UInt32 newR = R(imgColor) * (1 - transparentAlpha) + R(transparentColor) * transparentAlpha;
            UInt32 newG = G(imgColor) * (1 - transparentAlpha) + G(transparentColor) * transparentAlpha;
            UInt32 newB = B(imgColor) * (1 - transparentAlpha) + B(transparentColor) * transparentAlpha;

            // Clamp, not really useful here :p
            newR = MAX(0,MIN(255, newR));
            newG = MAX(0,MIN(255, newG));
            newB = MAX(0,MIN(255, newB));

            *imgPixel = RGBAMake(newR, newG, newB, A(imgColor));
        }
    }
    // Create a new UIImage
    CGImageRef newCGImage = CGBitmapContextCreateImage(context);
    UIImage * processedImage = [UIImage imageWithCGImage:newCGImage];

    self.mainImage.image = processedImage;

}

我遇到的问题是透明图像正在环绕。我的意思是,如果我将它贴在照片的边缘附近,它将继续照片,然后开始放在照片的最左边。参见example ::

enter image description here enter image description here

0 个答案:

没有答案