2013-12-06 2 views
2

Мое требование - обрезать изображение с помощью маски. Возможность обрезать изображение, но не в точном соотношении, как ожидалось. Я googled вокруг и попытался осуществить его, но, к сожалению, не получил результат, как ожидалось. Это то, что я получаю после обрезки изображения.Обрезать изображение с использованием маски

Before cropping

After cropping Ниже приводится код, я использую.

- (UIImage*) maskImage1:(UIImage *) image withMask:(UIImage *) mask 
{ 
CGImageRef imageReference = image.CGImage; 
CGImageRef maskReference = mask.CGImage; 

CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference), 
             CGImageGetHeight(maskReference), 
             CGImageGetBitsPerComponent(maskReference), 
             CGImageGetBitsPerPixel(maskReference), 
             CGImageGetBytesPerRow(maskReference), 
             CGImageGetDataProvider(maskReference), 
             NULL, // Decode is null 
             YES // Should interpolate 
             ); 

CGImageRef maskedReference = CGImageCreateWithMask(imageReference, imageMask); 
CGImageRelease(imageMask); 

UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference]; 
CGImageRelease(maskedReference); 

return maskedImage; 
} 

спасибо .. !!

ответ

1

Альтернативой

Вы также можете достичь того же эффекта с CALayers, и, по-моему, ясно.

- (UIImage*) maskImage1:(UIImage *) image withMask:(UIImage *) mask 
{ 
    UIImage* maskedImage = image; 

    CALayer *maskLayer = [CALayer layer]; 

    maskLayer.frame = maskedImage.bounds; 
    maskLayer.contents = (__bridge id) mask.CGImage; 

    maskedImage.layer.mask = maskLayer; 

    return maskedImage; 
} 

Возможно решение

Ваша маска UIImage, вероятно, имеет contentScale неправильный

mask.layer.contentScale = [UISCreen mainScreen].scale; 

Вы также можете заставить размер вашей маски, прежде чем делать CGImageMaskCreate:

mask.frame = image.bounds; 
+0

Спасибо за ваш ответ. Извините, но я не могу понять, как использовать свой код в моем. Не могли бы вы предложить? – Mahesh

+0

изменил мой ответ, поэтому мое альтернативное решение поддерживает ваше имя и структуру функции –

0

Возможно, у вас уже было так но, поскольку у меня была та же проблема, и я решил это, я объясню решение: маска применяется к реальному размеру фотографии, в моем случае это было 3264x2448 и логично, что это не размер экрана iphone, поэтому когда маска накладывается на изображение, она становится очень маленькой. Я решил создать слой на фотошопе с размером 3264x2448 и масштабировать маску, чтобы он оставался точно таким же, как на экране iphone.

Другая проблема, с которой я столкнулся, заключается в том, что изображение получило другую ориентацию, когда я сделал снимок (я использовал камеру), затем мне пришлось превратить маску в ту же ориентацию изображения на этом слое фотошопа. Изменение ориентации дает вам смену сторон, то, что теперь было шириной, как и наоборот, поэтому, когда мне приходилось вычислять масштаб, мне приходилось обращать внимание на то, какую сторону нужно умножить, чтобы получить правильный масштаб.

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