2013-08-03 2 views
2

Я пытаюсь создать функцию в своем приложении, которая позволяет пользователю извлекать указанную область существующего изображения и сохранять ее как png с включенной альфа.Создание alpha для UIImage

Я поставил UIView наверх в UIImageView - на imageView отображает изображение, в то время как вы рисуете вашу маску на прозрачном view. Для рисования я использую UIBezierPath. Пользователь может рисовать вокруг объекта, а внутри будет временно заполняться черным.

Пользователь выбирает изображение из фото ролла, и он представлен в основном UIImageView, как показан на рисунке слева, и когда пользователь обращается форма (которая автоматически закрывает), на вышележащих UIView, это выглядит как правое изображение:

Without mask With drawn-on mask

Это работает, как ожидалось, но когда пользователь нажимает кнопку «Crop», то магия должна начать. До сих пор я только был в состоянии создать «маску» и сохранить его как изображение на рулоне, как показано здесь (никогда виду соотношение сторон, я починю, что позже):

Saved "mask" Image and the generated "mask"

Это обычный образ, созданный по пути/форме, с цветами (черный на белом, а не черный на прозрачном). Мне нужен какой-то способ использовать это «изображение» в качестве альфа-канала для исходного изображения.

Я знаю, что это две совершенно разные вещи, что альфа-канал не совпадает с изображением, но у меня есть форма, поэтому я хотел бы знать, есть ли какой-либо возможный способ «обрезать» или «alpha out» с моими данными. То, что я хочу, чтобы в конечном итоге, является PNG лица этой кошки, с окружающей средой 100% прозрачным (или даже не там), так что я могу изменить фон, как это:

Transparent white background Transparent orange background

важно отметить, что я не говорить о показе в UIImageView с нанесенной маской UIImage, я говорю о создании нового образа, на основе существующего изображения, в сочетании с другим изображения, что я хочу каким-то образом преобразуются в альфа-канал первого изображения, тем самым сохраняя одно изображение, как показано выше, с прозрачностью.

Я не слишком хорошо разбираюсь в обработке изображений, поэтому мне было интересно, если кто-нибудь знает, как создать новое изображение на основе двух изображений, один из которых действует как альфа для другого, когда не изображений обязательно для начала нужно использовать альфа-канал.

ответ

2

метод ниже будет принимать исходное изображение и изображение маски (черная форма) и возвращает UIImage, который включает только содержание изображения покрыта маской:

+ (UIImage*) maskImage:(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; 
} 

области за пределами маски будет прозрачным. Затем вы можете объединить полученный результат UIImage с цветом фона.

+0

Спасибо, я проверю это через день или два, но похоже, что он принимает альфа второго изображения и применяет его к первому, и я не думаю, что форма, которую я создаю, альфа-канал на нем, как сейчас, но я попытаюсь найти способ сделать это. Я бы предположил, что оба изображения должны быть точно такого же размера, как и в этот момент. Я попробую кое-что и надеюсь, что скоро вернусь с хорошими новостями :) – Sti

+0

Это сработало наконец. Я узнал, что я уже пробовал это, но, как оказалось, у одного из изображений, которые я отправил, был фиктивный альфа-канал, который его испортил. Благодаря конвертации обоих в JPEG перед отправкой на этот метод, он отлично работал, спасибо. (Кажется, что он не работает на iOS7, хотя) – Sti

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