2013-06-25 5 views
9

У меня есть одноцветное изображение, и мне нужно изменить его размеры с разным масштабом. Желаемый результат показан на изображении. Я посмотрел на применение сетки сетки в opengles, но я не мог найти пример кода или более подробный учебник. Я также посмотрел imgwrap, но, насколько я вижу, для этой библиотеки требуется qt framework. Любые идеи, пример кода или ссылки для дальнейшего чтения будут оценены, спасибо. enter image description hereUIImage нелинейное изменение размера

+0

Напоминает мне о эффектах раздувания и морщин в фотошопе. – William

+1

Это выглядит полезным: http://stackoverflow.com/a/10230515/210171 – nielsbot

ответ

1

Возможно, вы захотите попробовать this example с использованием тонких пластинчатых сплайнов и OpenCV.Это, на мой взгляд, самое простое решение, которое находится в сети.

+0

Это выглядит потрясающе! Как я вижу, это просто простой способ создания изображения с сеткой или я ошибаюсь? Я уже реализовал GPUImageBulgeDistortionFilter, но это может быть полезно, если требования к изменению клиента. –

+1

Он уверен, что это потрясающе. Ни одна из библиотек там не дает интерфейса так просто, как это. Если вам нужно больше настраиваемых искажений, чем у GPUImageBulgeDistortionFilter, это отличный вариант. – Totoro

2

Несколько идей:

  1. Копирование части UIImage в различный CGContext с использованием CGBitmapContextCreateImage(), скопируйте части вокруг, масштаб индивидуальны, положить вместе.
  2. Используйте эффекты CIFilter на частях вашего изображения, маскируя части, которые вы хотите масштабировать. (Core Image Programming Guide)
+0

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

+0

Да, это очевидный вопрос, у них гораздо больше вариантов, чем я когда-либо использовал. Если у вас есть доступ к этим образцам WWDC-лет, было хорошее демо-приложение, вы можете протестировать все фильтры (просто зайдите на портал разработчиков). Другой список находится здесь: http://developer.apple.com/library/ios/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html – Bersaelor

3

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

Вот и я даю вам ссылку на вопрос, пожалуйста, прочитайте его, это может быть полезно в вашем случае:

How to scale only specific parts of image in iPhone app?

+0

Ответ MrTJ ближе к тому, что я думаю, что хочет OP. – nielsbot

+0

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

8

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

Практически: лучшим вариантом для iOS будет создание 2D сетки вершин в OpenGL. Сопоставьте исходное изображение как текстуру над этой сеткой и деформируйте исходную сетку, вытеснив некоторые ее точки. Затем вы просто сделаете скриншот полученного изображения с помощью glReadPixels.

Я не знаю ни одного CIFilter, который бы реализовал отображение полей смещения такого типа.

UPDATE: Я нашел также пример кода, который использует 8 контрольных точек для преобразования изображений с помощью OpenCV. http://engineeering.blogspot.it/2008/07/image-morphing-with-opencv.html

OpenCV имеет рабочие порты для iOS, поэтому вы можете просто поэкспериментировать с кодом на ссылке выше и на целевом устройстве.

+0

Поблагодарите MrTJ, ваш ответ, скорее всего, лучший способ сделать это, но сложнее и трудоемко. Я уже написал в вопросе, что я ищу более легкий подход. –

+1

Не приходит в голову, что будет проще. Если вам нужен быстрый и практичный учебник по OpenGL, я бы порекомендовал http://iphonedevelopment.blogspot.it/2009/05/opengl-es-from-ground-up-table-of.html – MrTJ

+1

Я нашел (и добавил) также реализация OpenCV для алгоритма, описанного выше. – MrTJ

1

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

Это не будет простым, но есть некоторые примеры кода для других искажений. Вот вихрь в шейдерах: http://www.geeks3d.com/20110428/shader-library-swirl-post-processing-filter-in-glsl/

Я не думаю, что есть простой способ сделать это без привлечения OpenGL, и вы, вероятно, не найдете отличной производительности для этого вне GPU.

+0

Спасибо, Колин, это, наверное, самый мощный способ выполнить мое требование, но я спросил, что я ищу более легкий подход, чем OpenGL. –

+0

Да, я это видел. Я просто не уверен, что для этого есть более легкий подход, чем OpenGL. Он может быть таким же легким, как он. :) –

2

Предлагаю вам ознакомиться с проектом GPUImage Брэда Ларсона на GitHub. Под Визуальные эффекты вы найдете фильтры, такие как GPUImageBulgeDistortionFilter, которые вы сможете адаптировать под свои нужды.

+0

Спасибо, это решение, которое я выбрал тем временем, и его работы довольно хорошо для моей проблемы. –

+0

Отлично! Рад, что он работает на вас. –

Смежные вопросы