Обрезать альфа-канал из CGImage

Мне нужно получить обрезанный CGImage. У меня есть изображение с пустым пространством (альфа = 0) вокруг некоторых цветов, и его нужно обрезать, чтобы получить размер только видимых цветов.

Спасибо.


person jsadfeew    schedule 10.02.2011    source источник


Ответы (1)


Есть три способа сделать это:

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

2) Проигнорировать - почему бы просто не проигнорировать, нарисовать изображение в полный размер? Это прозрачно, поэтому пользователь никогда не заметит.

3) Напишите некоторый код, который проходит через каждый пиксель изображения, пока не дойдет до того, у которого значение альфа> 0. Это должно дать вам количество строк, которые нужно обрезать сверху. Однако это замедлит ваш пользовательский интерфейс, поэтому вы можете сделать это в фоновом потоке.

e.g.

// To get the number of transparent rows at the top of the image
// Sorry this code is so ugly
uint32 *p = start_of_image;
while ( 0 == *p & 0x000000ff && p < end_of_image_data) ++p;
uint number_of_white_rows_at_top = (p - start_of_image) / width_of_image;

Когда вы знаете количество прозрачного пространства вокруг изображения, вы можете нарисовать его с помощью UIImageView, установить renderMode в центр и позволить ему выполнить обрезку за вас :)

person deanWombourne    schedule 10.02.2011
comment
Мне нужно сделать это динамически, и мне нужен размер (не точный, но мне он нужен), поэтому 1 и 2 не работают. Я попробовал подход, похожий на № 3, но он слишком медленный: / Попробую именно так, как вы предложили. Я надеялся, что есть способ с помощью магии масок. - person jsadfeew; 10.02.2011
comment
Это определенно слишком медленно для работы в основном потоке - у меня есть приложение, которое обрезает верх и низ изображений, но мне нужно сделать NSOperationQueue, чтобы справиться с их обработкой в ​​фоновом режиме :( - person deanWombourne; 10.02.2011