如何在存在的图像上添加水印

我发现一些代码如下:

UIGraphicsBeginImageContext(CGSizeMake(320, 480)); // This is where we resize captured image [(UIImage *)[info objectForKey:UIImagePickerControllerOriginalImage] drawInRect:CGRectMake(0, 0, 320, 480)]; // And add the watermark on top of it [[UIImage imageNamed:@"Watermark.png"] drawAtPoint:CGPointMake(0, 0) blendMode:kCGBlendModeNormal alpha:WATERMARK_ALPHA]; // Save the results directly to the image view property imageView.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

但我不确定这是否是最好的方法。

检查CGImageCreateWithMask 。

将现有的图像和水印图像传递给这个函数

 - (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { CGImageRef maskRef = maskImage.CGImage; CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); return [UIImage imageWithCGImage:masked]; } 

有不同types的水印:可见和不可见水印。 因为你没有提到明确你想要一个可见的水印,我会提供一个不可见的水印的解决scheme。 这种简单的理论:采取优先级最低的位,并在那里添加水印。

在iPhone编程中会是这样的:

 CGContextRef context = [self createARGBBitmapContextFromImage:yourView.image.CGImage]; unsigned char* data = CGBitmapContextGetData (context); size_t width = CGImageGetWidth(yourView.image.CGImage); size_t height = CGImageGetHeight(yourView.image.CGImage); for (int y=0; y<height; y++) { for (int x=0; x<width; x++) { int pos = y*width + x; int argb = data[pos]; int r = (argb >> 16) & 0xff; int g = (argb >> 8) & 0xff; int b = argb & 0xff; //add watermark to the bits with the lowest priority unsigned char bit1 = 0x00 , bit2 = 0x01, bit3 = 0x00; //example adds false, true, false to every pixel - only 0x00 and 0x01 should be used here (1 bit) unsigned char mask = 0x01; r = (r - (r & mask)) + bit1; g = (g - (g & mask)) + bit2; b = (b - (b & mask)) + bit3; data[pos] = (0xFF<<24) | (r<<16) | (g<<8) | b; } } 

编码将反之亦然 – 您可以使用此代码宽度*高度* 3位存储在您的图像中。 即一个640×480的图像,将是996字节它可以存储更多的位每像素,但也将失去更多的细节在这种情况下(那么你需要改变掩码0x01)。 阿尔法通道也可以用来存储一些位 – 为了简单起见,我把它放在这里…

Imagemagick可能是最广泛使用的这种types的库。 如何水印。

我不认为你需要一个图书馆来做到这一点。 对于这么简单的事情来说太过分了。 至lessOmnipotentEntity提出的图书馆在我看来太多了。

你正在尝试的方法很简单,很好。 即使它不工作,你也可以自己做。 混合是一个非常简单的algorithm。

来自WikiPedia:

替代文字

其中Co是操作的结果,Ca是元素A中的像素的颜色,Cb是元素B中的像素的颜色,并且αa和αb分别是元素A和元素B中的像素的α

我要写如何访问像素,但康斯坦丁已经做到了!