9
votes

UIImage redimensionnement non linéaire

J'ai une image unicolore et j'ai besoin de redimensionner certaines parties de celle-ci, avec une échelle différente. Le résultat souhaité est montré sur l'image. J'ai examiné l'application de maille de grille dans Opengles, mais je n'ai pas pu trouver du code d'échantillon ou un tutoriel plus détaillé. J'ai aussi consulté imgwrap mais aussi loin que je peux voir que cette bibliothèque nécessite un cadre QT . Toute idée, échantillon de code ou de liens pour la lecture ultérieure sera appréciée, merci. Entrez la description de l'image ici


2 commentaires

Cela me rappelle des effets de blague et de ponte dans Photoshop.


Cela semble serviable: Stackoverflow.com/a/10230515/210171


6 Réponses :


2
votes

Quelques idées:

  1. copier des pièces de l'uiimage en différents CGContext en utilisant CgbitmapcontextCreateImage (), copie les pièces autour de l'échelle individuellement, remis ensemble.
  2. Utilisez des effets CIFILTER sur des parties de votre image, masquant les pièces que vous souhaitez échouez. ( Guide de programmation de l'image principale )

2 commentaires

Toute idée que CiFilter ferait le travail?


Oui, c'est la question évidente, ils ont beaucoup plus d'options que j'ai jamais utilisées. Si vous avez accès à cette année, des échantillons de WWDC, vous avez eu une belle démo-application si vous pouvez tester tous les filtres (aller au portail du développeur). Une autre liste est ici: développeur.Apple. com / bibliothèque / iOS / # documentation / graphiquesImagi ng / ...



3
votes

Je ne suis pas sûr, mais je suggère que si vous voulez faire ce type de travail, vous devez recadrer une partie de l'image et appliquer votre fonctionnalité de redimensionnement / fonctionnalité dans cette partie recouverte de l'image et mettre en position à la position. Je ne sais pas que mon opinion n'est pas sûr que cela soit vrai pour vous ou non.

ici aussi je vous donne le lien de la question s'il vous plaît lisez-le, il pourrait être utile dans votre cas:

Seule à l'échelle des parties spécifiques de Image dans l'application iPhone?


2 commentaires

La réponse de MRTJ est plus proche de ce que je pense voeuté.


Merci ipatel, j'ai essayé de recadrer l'image et redimensionner des pièces spécifiques, mais le problème dans cette approche est que lorsque l'image est redimensionnée à recadrer, puis composée ensemble, il y aura des bords et l'image ne semblera pas cohérente.



8
votes

Le problème que vous rencontrez est appelé "gauchissement de l'image" dans les graphiques informatiques. Vous devez d'abord définir des points de contrôle dans l'image d'origine et les points correspondants dans une image de destination d'échantillon. Ensuite, vous devez calculer un champ de déplacement dense (dans cette application appelée également la grille d'emballage) et simple appliquer ce champ à l'image d'origine.

Plus pratiquement: votre meilleur pari sur iOS sera de créer une grille 2D de sommets dans OpenGL. Mappez votre image originale comme une texture sur cette grille et déformez la grille d'origine en déplaçant certains de ses points. Ensuite, vous prenez une capture d'écran de l'image résultante avec GlreadPixels.

Je ne connais pas de CIFILTER qui impliquerait la cartographie de champ de déplacement de ce type.

update: J'ai trouvé également un exemple de code qui utilise 8 points de contrôle pour Morph Images avec OpenCV. http://enfineering.blogspot.it/2008/07/Image -Morphing-with-opencv.html

opencv a des ports de travail sur iOS, de sorte que vous puissiez une expérience simple avec le code sur le lien ci-dessus également sur un périphérique cible.


3 commentaires

Merci MRTJ, votre réponse est la plus probablement la meilleure façon de le faire, mais de la consommation la plus difficile et du temps. J'ai déjà écrit en question que je cherche une approche plus légère.


Ne vient rien dans mon esprit qui serait plus simple. Si vous avez besoin d'un tutoriel rapide et pratique sur OpenGL, je pourrais recommander iPhoneDevelopment.blogspot.it/2009/05/...


J'ai trouvé (et ajouté) également une implémentation OPENCV pour l'algorithme décrit ci-dessus.



1
votes

Vous voudrez probablement regarder OpenGL Shaders. Ce que je ferais, c'est que je chargerais l'image en tant que texture, appliquez un fragment Shader (qui est un petit programme qui vous permettra de disttraper l'image), rendez les résultats à une texture et affichez cette texture. ou l'enregistrez comme un bitmap.

Ce ne sera pas simple, mais il y a un exemple de code là-bas pour d'autres distorsions. Voici un tourbillon dans des shaders: http://www.geeks3d.com/ 20110428 / Shader-Bibliothèque-Swirl-Swirl-post-traitement-filtre-in-GLSL /

Je ne pense pas qu'il y ait un moyen plus facile de le faire sans impliquer OpenGL, et vous ne trouveriez probablement pas de grandes performances dans le faire en dehors du GPU non plus.


2 commentaires

Merci Colin C'est probablement un moyen le plus puissant de faire la mes exigence, mais la question de l'IM NA, j'ai écrit que je cherche une approche plus légère que OpenGL.


Ouais, j'ai vu ça. Je ne suis tout simplement pas sûr qu'il y a une approche plus légère que OpenGL pour cela. Cela peut être aussi léger que possible. :)



1
votes

Vous voudrez peut-être essayer Cet exemple en utilisant Splines minces et opencv. Ceci, à mon avis, est la solution la plus simple à essayer en ligne.


2 commentaires

Cela a l'air génial! Comme je le vois, c'est un peu facile de créer une chaîne d'image avec maille ou je me trompe? J'ai déjà mis en œuvre GPUIMAGEBULDISTORISTORISTORLITTORISTORISTORISTORISTORISTORISTORISTORISTORISTORISTORISTORISTORISTORISTORISSÉS, mais cela peut être utile si le client modifie les exigences.


C'est sûr que c'est génial. Aucune des bibliothèques ne donne une interface aussi simple que ceci. Si vous avez besoin de distorsions plus personnalisées que de GPUIMAGEBULGEDISTORISTORISTORISTORISTORISTORISTORISTORISTORISTORISTORISTORIQUES, Ceci est une excellente option.



2
votes

Je vous suggère de consulter Brad Larson's Projet GPuimage sur GitHub. Sous Effets visuels Vous trouverez des filtres tels que GPuImageBulgStorstorstTartimilter , que vous devriez pouvoir adapter à vos besoins.


1 commentaires

Merci, c'est la solution que j'ai choisie entre-temps et ses œuvres assez bien pour mon problème jusqu'à présent.