как добавить водяной знак на существующее изображение - PullRequest
3 голосов
/ 01 ноября 2010

Я нашел следующий код:

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

но я не уверен, что это лучший способ.

Ответы [ 4 ]

7 голосов
/ 31 января 2011

Проверка 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 голосов
/ 12 января 2011

Существуют различные типы водяных знаков: видимые и невидимые водяные знаки. Поскольку вы не упомянули явно, что вы хотите видимый водяной знак, я предоставлю решение для невидимого водяного знака. Теория этого типа проста: возьмите биты с самым низким приоритетом и добавьте туда свой водяной знак.

В программировании на 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 бита в вашем изображении. То есть для изображения 640x480, которое будет 996 байт Он может хранить больше битов на пиксель, но в этом случае также теряет больше деталей (тогда вам нужно изменить маску 0x01). И альфа-канал также может быть использован для хранения нескольких битов - для простоты я оставил это здесь ...

1 голос
/ 12 января 2011

Я не думаю, что вам нужна библиотека для этого.Это слишком много для такой простой вещи.По крайней мере, библиотека, предложенная OmnipotentEntity, на мой взгляд, слишком большая.

Подход, который вы пробуете, прост и хорош.Даже если это не сработает, вы можете сделать это сами.Смешивание очень простой алгоритм.

Из WikiPedia:

alt text

, где Co - результат операции, Ca - цвет пикселя в элементе A, Cb - этоцвет пикселя в элементе B, а αa и αb - альфа пикселей в элементах A и B соответственно

Я собирался написать, как получить доступ к пикселям, но Константин уже сделал это!

1 голос
/ 01 ноября 2010

Вероятно, наиболее широко используемая библиотека для такого рода вещей называется Imagemagick. Как сделать водяной знак.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...