2012-02-16 2 views
3

Я первоначально подошел к этой проблеме с учетом CoreImage (потому что мне также нужно сделать распознавание лиц), но понял, что, к сожалению, фильтры CI Distortion еще не включены в iPhone.iOS Image Manipulation (Distortion)

Я попытался погрузиться в GLImageProcessing, CImg и ImageMagick, хотя у меня было много проблем с поиском отправной точки для изучения любого из них.

Учитывая количество приложений, которые искажают изображение, я знаю, что это не может быть невероятно сложно.

Я не знаю C или C++, и у меня нет времени изучать эти языки, если это абсолютно необходимо. Было бы необходимо, если одна из этих библиотек является окончательной библиотекой для решения этой задачи.

У кого-нибудь есть опыт работы с любой из этих библиотек?

Любые книги, которые покрывают это для iOS5 конкретно?

Ресурсы я нашел:

+1

Раньше я использовал ImageMagick, и это было немного хлопот, когда он стал «правильным» для нашего продукта OS X, но в конце концов он того стоил. К сожалению, у меня больше нет этого файла makefile, поэтому я не могу дать его вам. –

+1

Если вы хотите использовать одну из этих библиотек, вам придется потратить время, чтобы изучить язык, на котором он написан. Возможно, я не понимаю ваш вопрос. –

+0

Спасибо за ответы, ребята, просто не то, что я хотел услышать :(Глупый Apple за то, что у этих фильтров еще нет доступных разработчиков! –

ответ

13

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

Однако я могу указать вам на фреймворк с открытым исходным кодом под названием GPUImage, который я только что выкатил, потому что не мог найти что-то, что позволит вам снять пользовательские эффекты. Как видно из названия, GPUImage выполняет GPU-ускоренную обработку неподвижных изображений и видео с использованием шейдеров OpenGL ES 2.0. Вы можете написать свои собственные пользовательские эффекты, используя их, чтобы вы могли делать все, о чем можете подумать. Сама инфраструктура - Objective-C и имеет довольно простой интерфейс.

В качестве примера искажения фильтра, следующим шейдер (на основе кода в Danny Pflughoeft's answer) делает своего рода эффект рыбьим:

varying highp vec2 textureCoordinate; 
uniform sampler2D inputImageTexture; 

const mediump float bulgeFactor = 0.5; 

void main() 
{ 
    mediump vec2 processedTextureCoordinate = textureCoordinate - vec2(0.5); 
    mediump float radius = processedTextureCoordinate.x * processedTextureCoordinate.x + processedTextureCoordinate.y * processedTextureCoordinate.y; 
    mediump vec2 distortedCoordinate = vec2(pow(radius, bulgeFactor)) * processedTextureCoordinate + vec2(0.5); 

    gl_FragColor = texture2D(inputImageTexture, distortedCoordinate); 
} 

Это производит такой эффект на видеопотока:

Fisheye effect filter

В моих тестах, GPUImage обрабатывает изображения в 4 раза быстрее, чем ядра изображения на iPhone 4 (6X быстрее, чем CPU переплете обработки) и видео 25X быстрее, чем основное изображение (70x быстрее, чем на CPU). Даже в худшем случае я мог бы наброситься на него, он соответствует Core Image для скорости обработки.

Рамка по-прежнему довольно новая, поэтому количество фильтров запаса, которые у меня есть сейчас, невелико, но я скоро добавлю кучу. В то же время вы можете создавать собственные собственные искажающие шейдеры для обработки ваших изображений, а исходный код для всего доступен для вас по мере необходимости. My introductory post about it содержит более подробную информацию о том, как использовать это в ваших приложениях.

+0

Очень классный материал Брэд! Можем ли мы компостировать изображения с вашими шейдерами и вашей каркасом? –

+0

@JeshuaLacock - Пока еще нет. Мне нужно добавить небольшое расширение к фильтрам, чтобы они могли принимать более одного изображения за раз. Я сосредоточился на том, чтобы сначала создать все фильтры одного изображения, но я посмотрю, смогу ли я быстро реализуйте что-то для компоновки. –

+0

Nice! Есть ли место, где я могу следить за вещами, или я должен периодически проверять ваш GIT? Также мне очень интересен шейдер с обратным эффектом (меньше в середине и больше по краям). Должен ли я публиковать новый вопрос? –