我正在尝试在当前图片上添加透明背景的图像。我有以下代码:
#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 ::