Как я могу автоматически найти координаты границ внутри PNG с прозрачностью? - PullRequest
1 голос
/ 14 мая 2009

Представьте себе: у меня есть изображение PNG с изображением плюшевого мишки или треугольника. Что-то не квадратичное. Теперь я хочу выяснить, в какой точке для данной строки и направления (координаты относительно системы координат UIImageView) начинается фактическое видимое изображение.

Пример. Допустим, мне нужно знать, где ноги медвежонка начинаются слева, если смотреть на последнюю строчку. Конечно, это не просто frame.origin.x, потому что ноги не квадратичны. Это может начаться где-то в x = 12.

Я бы как-то перебрал данные изображения и осмотрел пиксели: «Эй, ты прозрачный?». И если это так, я перехожу к следующему. «Эй, что с тобой? Прозрачный?». Пока я не получу результат: «Нет! Я совершенно непрозрачен!». Тогда я знаю: «Правильно! Здесь ноги начинаются в PNG! Это граница!».

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

Итак: есть ли способ вообще проанализировать данные UIImage или изображения, чтобы проверить, является ли пиксель прозрачным или нет?

Ответы [ 3 ]

3 голосов
/ 14 мая 2009

Я нашел этот урок в сети, где вы можете получить значение UIColor (ARGB) каждого пикселя на экране. возможно, если вы немного подправите, вы можете передать ему UIImage и получить все нужные вам значения

2 голосов
/ 14 мая 2009

По-видимому, нет достаточно простого способа сделать это с помощью UIImage. Вместо этого я вижу два более простых варианта.

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

Кроме того, библиотеки изображений, такие как libpng , могут быть статически скомпилированы в вашу программу. Вы можете загрузить изображение, выполнить обработку, а затем выгрузить его и передать файл в UIImage. Будут связаны только те функции, которые вы используете, так что вы можете избежать добавления слишком большого объема, поскольку подпрограммы рендеринга могут быть опущены. Это имеет тот недостаток, что ваше программное обеспечение полагается на сторонние библиотеки.

1 голос
/ 15 мая 2009

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

В качестве альтернативы, если вы жаждете наказания, вы можете получить свойство CGImage UIImage, затем использовать функции CoreGraphics для определения формата пикселей, а затем написать код для декодирования данных формата пикселей ...

Последний вариант, если вы управляете используемыми изображениями: создайте изображение маски (1-битное альфа) из изображения, а затем используйте его для определения расположения краев. Вы можете легко создать такую ​​маску в графическом редакторе или, вероятно, сделать это, нарисовав изображение в 1-битном контексте в памяти, если вы правильно установили свойства чертежа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...