Как отточить только одну часть 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

  • Изображение первой страницы pdf ios sdk
  • Несколько CIFilters в одном CIImage?
  • Исправление ориентации UIImage, хранящегося в документе, с потерянными тегами EXIF
  • Наложение камеры с помощью User-Photo не сохраняется как отредактировано
  • Изменение размера изображения с помощью capinsets
  • UIImage до CIImage - размер уменьшается вдвое?
  • Избегание смешанных слоев при использовании resizableImages на iOS
  • Как позволить UIImage растягиваться только в определенной области?
  • как изменить программный код uiimageview
  • Как добавить несколько UIImageViews для подкачки UIScrollView?
  • Применение градиента к UIImage плавно
  • Interesting Posts
    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.