Ускоренный способ обнаружения и удаления прозрачного пространства вокруг NSImage - PullRequest
2 голосов
/ 09 июня 2011

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

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

Спасибо, Марк.

PS: Мой вариант использования:

Я использую QLThumbnailImageCreate для создания миниатюр файлов. Проблема в том, что все изображения, возвращаемые этим вызовом, имеют одинаковую ширину и высоту.

Например, если я создаю миниатюру для фотографии размером 300x500, получающийся в результате предварительный просмотр будет иметь ту же ширину и высоту с прозрачными областями, добавленными сверху и снизу для сохранения соотношения сторон.

1 Ответ

2 голосов
/ 11 июня 2011

На самом деле очень быстро перебирать пиксели изображения, если вы просто получаете указатель на необработанные данные пикселей. Даже на устройствах iOS это довольно быстро.

Используя CGImageRef, вы получите данные о пикселях следующим образом:

CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(anImage)); 
const UInt32 *pixels = (const UInt32*)CFDataGetBytePtr(imageData);

и вы можете просто перебрать его:

for (int j = 0; j < (anImageHeight * anImageWidth); j++)
{
    if (pixels[j] & 0xff000000)
    {
    //this is not a transparent pixel
    }
}
...