iPhone l'image s'étendant (skew)
Comment incliner une image? Par exemple, chaque coin a une CGPoint avec coords - p1, p2, p3, p4. Ensuite, j'ai besoin de régler p4.x+=50, p4.y+=30. Donc, ce coin (p4) doit être étendu à un point de vue 2D et l'image ne doit pas être déformé.
(source: polar-b.com)
J'ai essayé d'utiliser CATransform3D, mais il semble que cela ne peut être fait de telle façon, puisque c'est seulement un changement du point de vue (rotation, apporter plus près ou plus loin un côté). Peut-être CGAffineTransform peut-elle être utile?
Si vous connaissez la réponse, s'il vous plaît écrire un exemple de code.
Merci d'avance
- Voici une autre façon de réaliser ceci: stackoverflow.com/questions/9470493/... Laissez-moi savoir si cela aide.
- Pour 2016: merci à l'incroyable travail de base ici: voici une liste rapide de la solution de stackoverflow.com/a/39981054/294884
Vous devez vous connecter pour publier un commentaire.
Pas possible avec CGAffineTransform. Une transformation affine peut toujours être décomposé en translations, rotations, de cisaillement et de mise à l'échelle. Ils ont tous la carte des parallélogrammes en parallélogrammes, qui votre transformation n'.
De votre transformation, il peut être fait en deux étapes. De convertir la place dans un trapèze.
De l'autre dans le sens vertical. Un naïf règle de transformation est
où c est l'abscisse du point d'intersection des lignes reliant p1 et p3 et p2 et p4.
Maintenant l'avis de la x*y facteur dans la transformation. Ceci indique qu'une telle transformation est pas linéaire. Par conséquent, CATransform3D ne peut effectuer qu'une transformation 2D soit.
Cependant, le vecteur
sera converti en 3D réelle vecteur
avant de projection si CA suit d'habitude 3D calculer les règles graphiques, de sorte que vous pouvez "tricher" en utilisant la transformation
appropriés P, Q, R, S, T, U, qui mappe les 4 points de la lieux. (6 unique coordonne et 6 variables devraient avoir exactement 1 solution de la plupart des cas.)
Lorsque vous avez trouvé ces 6 constantes, vous pouvez créer un CATransform3D. Avis de la définition de la structure est
De sorte que vous pouvez modifier directement les éléments de la matrice, au lieu de compter sur la CATransform3DMake fonctions. (Vous devrez peut-être effectuer une transposition grâce à la convention de l'utilisation de la ligne ou de la colonne des vecteurs.)
Pour obtenir la transformation pour convertir un rectangle ((X, Y), (W, H)) pour tout quadrilatère ((x1a) y1a), (x2a, y2a); (x3a, y3a), (x4a, y4a)), l'utilisation de cette fonction (vous pouvez avoir besoin d'une transposition):
De transformation 3D sur UIImage /CGImageRef
Vous devriez être en mesure de calculer la cartographie de chaque pixel par vous-même.. Pas parfait, mais il fait l'affaire...
Elle est disponible sur ce référentiel http://github.com/hfossli/AGGeometryKit/
Les fichiers intéressants est
https://github.com/hfossli/AGGeometryKit/blob/master/Source/AGTransformPixelMapper.m
https://github.com/hfossli/AGGeometryKit/blob/master/Source/CGImageRef%2BCATransform3D.m
https://github.com/hfossli/AGGeometryKit/blob/master/Source/UIImage%2BCATransform3D.m
De transformation 3D sur UIView /UIImageView
https://stackoverflow.com/a/12820877/202451
Ensuite, vous aurez le plein contrôle sur chaque point dans le quadrilatère. 🙂
Vous devez ajuster
m24
etm14
pour obtenir une telle forme.J'ai essayé la merveilleuse réponse @KennyTM dans Swift, et ai une erreur "Expression trop complexe pour être résolu dans un délai raisonnable".
Voici donc une version simplifiée pour Swift: