【问题标题】:how to add watermark on a exist image如何在现有图像上添加水印
【发布时间】:2011-05-03 08:29:46
【问题描述】:

我找到了一些代码如下:

 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();

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

【问题讨论】:

  • 我找到一段代码如下:

标签: ios objective-c image


【解决方案1】:

检查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];

}

【讨论】:

    【解决方案2】:

    有不同类型的水印:可见和不可见水印。因为你没有明确提到你想要一个可见的水印,所以我将提供一个不可见水印的解决方案。这种理论很简单:取出优先级最低的位并在那里添加您的水印。

    在 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 位存储在图像中。 IE。对于 996 字节的 640x480 图像 它可以为每个像素存储更多位,但在这种情况下也会丢失更多细节(然后您需要更改掩码 0x01)。并且 alpha 通道也可以用来存储一些位 - 为简单起见,我把它放在这里了......

    【讨论】:

    • 你能解释/编辑上面的代码,用于在图像中插入水印文本,然后检索带水印的文本吗?
    • 你能展示一下这个方法吗? createARGBBitmapContextFromImage
    • @KhalidUsman createARGBBitmapContextFromImage 是 Apple 的 Core Graphics/Quartz 2D 框架的一部分。另见here
    【解决方案3】:

    对于这类事情,使用最广泛的库可能是 Imagemagick。 How to watermark.

    【讨论】:

    【解决方案4】:

    我认为你不需要图书馆来做这件事。对于这么简单的事情来说,这太过分了。至少 OmnipotentEntity 提出的库在我看来太过分了。

    您尝试的方法既简单又好。 即使它不起作用,你也可以自己做。混合是一种非常简单的算法。

    来自维基百科:

    其中 Co 是 操作,Ca 是颜色 元素 A 中的像素,Cb 是 元素 B 中的像素,以及 αa 和 αb 是像素的 alpha 分别为元素A和B

    我本来打算写如何访问像素,但康斯坦丁已经写好了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多