2010-11-01 3 views
2

Я нашел некоторый код следующим образом:как добавить водяной знак на изображение существует

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

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

+2

Я нахожу кусок кода следующим образом: – user493435

ответ

1

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

+2

спасибо за ответ, но может ли это быть использование на прошивкой? – user493435

+0

Подробнее см. Http://iphonesdksnippets.com/post/2010/01/29/ImageMagick-on-iPhone.aspx. – OmnipotentEntity

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

+0

Можете ли вы объяснить/изменить приведенный выше код для вставки текста водяного знака в изображение и затем получения этого текста с водяными знаками? –

+0

Не могли бы вы показать этот мехтод? createARGBBitmapContextFromImage –

+0

@KhalidUsman 'createARGBBitmapContextFromImage' является частью 2D-графики Core/Quartz от Apple. См. Также [здесь] (https://developer.apple.com/library/mac/documentation/graphicsimaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html#//apple_ref/doc/uid/TP30001066) – Constantin

1

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

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

из википедии:

alt text

где Со является результатом операции, Са цвет пикселя в элементе, Cb, является цветом пикселя в элементе Б и αa и αb являются альфа пикселей в элементов а и в соответственно

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

7

Проверить 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]; 

} 
Смежные вопросы