Как отточить только одну часть UIImage с альфа-каналом – PNG (замена цвета)?

У меня есть это прозрачное изображение:

введите описание изображения здесь

Моя цель – изменить «ME!». цвет деталей. Либо выберите только последнюю треть изображения, либо замените синий цвет на новый цвет.

Ожидаемый результат после изменения цвета:

введите описание изображения здесь

К сожалению, никто не работал на меня. Чтобы изменить конкретный цвет, я попробовал это: LINK , но, как говорится в документации, это работает только без альфа-канала!

Затем я попробовал это: LINK , но это на самом деле ничего не делает, никакого оттенка или чего-то еще.

Есть ли другой способ оттенять только одну часть цвета или просто заменять определенный цвет?

Я знаю, что смогу обрезать изображение в двух частях, но я надеюсь, что есть другой способ.

3 Solutions collect form web for “Как отточить только одну часть UIImage с альфа-каналом – PNG (замена цвета)?”

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

  1. Начните с полутоновой / альфа-версии вашего изображения, а не цветного: черный в областях, которые вы не хотите окрашивать, белый в областях, которые вы делаете
  2. Создайте контекст изображения с размерами изображения
  3. Заполните этот контекст черным
  4. Нарисуйте изображение в контекст
  5. Получите новое изображение (назовем его «the-image-over-black») из этого контекста
  6. Очистите контекст (чтобы его можно было использовать снова)
  7. Заполните контекст цветом, в котором вы хотите, чтобы тонированная часть изображения была
  8. Нарисуйте изображение-над-черным в контекст с помощью режима «multiply» blend
  9. Нарисуйте исходное изображение в контекст с помощью режима «назначение в режиме смешивания»
  10. Получите свое окончательное изображение из контекста

В коде (Objective-C):

 - (UIImage *)createTintedImageFromImage:(UIImage *)originalImage color:(UIColor *)desiredColor { CGSize imageSize = originalImage.size; CGFloat imageScale = originalImage.scale; CGRect contextBounds = CGRectMake(0, 0, imageSize.width, imageSize.height); UIGraphicsBeginImageContextWithOptions(imageSize, NO /* not opaque */, imageScale); // 2 [[UIColor blackColor] setFill]; // 3a UIRectFill(contextBounds); // 3b [originalImage drawAtPoint:CGPointZero]; // 4 UIImage *imageOverBlack = UIGraphicsGetImageFromCurrentImageContext(); // 5 CGContextClear(UIGraphicsGetCurrentImageContext()); // 6 [desiredColor setFill]; // 7a UIRectFill(contextBounds); // 7b [imageOverBlack drawAtPoint:CGPointZero blendMode:kCGBlendModeMultiply alpha:1]; // 8 [originalImage drawAtPoint:CGPointZero blendMode:kCGBlendModeDestinationIn alpha:1]; // 9 finalImage = UIGraphicsGetImageFromCurrentContext(); // 10 UIGraphicsEndImageContext(); return finalImage; } 

В коде (Swift 2.1):

 func createTintedImageFromImage(originalImage: UIImage, desiredColor: UIColor) -> UIImage { let imageSize: CGSize = originalImage.size let imageScale: CGFloat = originalImage.scale let contextBounds: CGRect = CGRectMake(0, 0, imageSize.width, imageSize.height) UIGraphicsBeginImageContextWithOptions(imageSize, false, imageScale) UIColor.blackColor().setFill() UIRectFill(contextBounds) originalImage.drawAtPoint(CGPointZero) let imageOverBlack: UIImage = UIGraphicsGetImageFromCurrentImageContext() desiredColor.setFill() UIRectFill(contextBounds) imageOverBlack.drawAtPoint(CGPointZero, blendMode: .Multiply, alpha: 1) originalImage.drawAtPoint(CGPointZero, blendMode: .DestinationIn, alpha: 1) let finalImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return finalImage } 

Причина этого – из-за сочетания режимов наложения. То, что вы делаете, создает полностью непрозрачное черно-белое изображение (шаг 5), а затем умножает его на ваш окончательный цвет (шаг 8), что дает вам полностью непрозрачное изображение с черным и окончательным цветом , Затем вы берете исходное изображение, которое по-прежнему имеет свой альфа-канал, и рисуйте его с помощью режима «назначения в режиме смешивания», который берет цвет от черного и цветного изображения и альфа-канала от исходного изображения. Результатом является тонированное изображение с исходными значениями яркости и альфа-каналом.

Есть много способов сделать это.

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

Если у вас было изображение с различными цветами в нем и все еще хотелось заменить ВСЕ Цвета на изображении, вы могли бы использовать CIColorCube для отображения синих пикселей в красный цвет, не затрагивая другие цвета. На прошлой неделе на этой плате была нить с примером кода с использованием CIColorCube, чтобы заставить один цвет другому. Найдите в CIColorCube и найдите самую последнюю запись, и вы сможете ее найти.

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

Вы также можете отрезать часть, которую хотите изменить, изменить ее цвет с помощью любого из множества методов, а затем объединить ее вместе.

Другой способ – использовать фильтр CoreImage – ColorCube. Сделал свою категорию, когда возникла эта проблема. Это для NSImage, но я думаю, что нужно работать для UIImage после некоторого обновления https://github.com/braginets/NSImage-replace-color

  • Изображение автоматически поворачивается после использования CIFilter
  • UIBezierPath с изображения
  • добавить белую границу к UIImage
  • Загрузка изображений для анимации в UIImageView - iOS
  • Как я могу ущипнуть масштабирование UIImage без использования UIImageView?
  • Приложение iOS сбой при загрузке изображения из Assets.xcassets
  • ALAsset defaultRepresentation fullResolutionImage
  • Создать UIImage определенного размера
  • Yelp API ios получает увеличенное изображение
  • Размер UIImage в UIImageView
  • Добавить UIImage поверх другого UIImage
  • Interesting Posts

    Как создать статическую библиотеку из существующей структуры в iOS?

    Верните обернутую словом NSString из более длинного файла NSString

    Возможно ли распознать персонаж на экране iPhone, используя Tesseract OCR?

    Кнопка с изображением и текстом, вертикально выровненная с использованием ограничений автоопределения

    Facebook Тип приложения: какой из них выбрать для мобильных и веб-сайтов?

    Запрос AFNetworking JSON для службы WCF REST

    Входящие параметры в swift 3

    Как вертикально центрировать текст UITextField?

    Расположение ячеек UICellView в быстрых

    Как читать данные с помощью CocoaAsyncSocket?

    Просмотр изображения ссылки для сообщений iOS10

    Получить имя файла изображения, сохраненного в фотоальбоме

    Отключить аппаратную клавиатуру для iOS Simulator, используя UIAutomation

    Swift iOS 9 Ошибка NSURLErrorDomain -1004

    Платеж api для перевода средств с банковских счетов в Mpesa (мобильные платежи)

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.