У меня есть UIImage с белым фоном. Я бы хотел заменить белый фон/пиксели альфа-прозрачными пикселями. Я рассмотрел другие вопросы по StackOverflow, наряду с документацией Quartz, но пока не нашел последовательного «сквозного» для этой проблемы. Как это делается?Замените все белые/почти белые пиксели в UIImage с альфой, используя CGImage?
ответ
CGImageCreateWithMaskingColors
A UIImage обертывает CGImage. Возьмите CGImage, запустите его через CGImageCreateWithMaskingColors, затем либо создайте новый UIImage из результата, либо верните результат в UIImage.
Первый шаг - вам нужно определить какую-то функцию «расстояния», чтобы определить, как далеко пиксел от белого. Затем вам нужно определить порог расстояния, ниже которого пиксель считается белым. Затем вам нужно будет перебирать пиксели изображения, изменяя любые пиксели, которые считались белыми в соответствии с вашим расстоянием и порогом, чтобы быть прозрачными. Основной трюк, тем не менее, делает это эффективным ... касание пикселей через функции будет очень медленным; лучше всего прикоснуться к пикселям directl, получив доступ к буферу памяти, в котором пиксели находятся и проходят через них.
Знаете ли вы о функциях, которые могут делать это в iPhone OS? Я не знаю, возможен ли прямой доступ к буферу памяти ... –
@Peter, извините, не совсем ... мой собственный подход состоял в том, чтобы отправить изображение в веб-службу, обработать ее на веб-службе, а затем верните изображение. Все, что будет делать обработка изображений, будет достаточно интенсивным с точки зрения вычислительной мощности и не очень хорошим для работы от батареи. –
Спасибо за это! Я немного запутался в параметрах функции, особенно в массиве «components». Каковы правильные значения CGFloat, чтобы заполнить это? В документации упоминаются компоненты пиксельных пикселей с целыми пиксельными компонентами. Как определить это, а какие значения представляют белый? Еще раз спасибо! –
Все зависит от изображения. Скорее всего, белый будет 255 255,255 для rgb png или jpg. Вы можете использовать 'CGImageGetBitmapInfo',' CGImageGetBitsPerPixel' и 'CGImageGetBitsPerComponent', чтобы узнать больше. – drawnonward
Большое спасибо за вашу помощь! Это было здорово! Для будущих людей я использовал: {0xEE, 0xFF, 0xEE, 0xFF, 0xEE, 0xFF} Hex, это то, что на ужин. –