J'essaie d'implémenter une vue d'édition d'image à l'aide des filtres MTKView et Core Image et que les bases fonctionnent et peuvent voir le filtre appliqué en temps réel. Cependant, l'image n'est pas positionnée correctement dans la vue - une personne peut-elle me signaler dans la bonne direction pour ce qui doit être fait pour que l'image soit effectuée correctement dans la vue. Il doit correspondre à la vue et conserver son rapport d'image d'origine.
Voici la fonction de tirage en métal - et le vides DrakAdAbsizeWillChanger !? - allez comprendre. Il convient probablement également de mentionner que la MTKView est une sous-vision d'une autre vue dans une vision de ScrollView et peut être redimensionnée par l'utilisateur. Ce n'est pas clair pour moi à quel point les métaux traitent la vue de la vue, mais il semble que cela ne vienne pas gratuitement. P>
J'essaie également d'appeler la fonction Draw () à partir d'un fil d'arrière-plan et cela semble trier de travailler. Je peux voir les effets de filtrage car ils sont appliqués à l'image à l'aide d'un curseur. Comme je le comprends, cela devrait être possible. P>
Il semble également que l'espace de coordonnage pour le rendu soit dans l'espace de coordonnée des images. Donc, si l'image est inférieure à la MTKView puis positionner l'image au centre de la Les coordonnées X et Y seront négatives. P>
Lorsque la vue est redimensionnée, tout devient fou de l'image devenant soudainement trop gros et que des parties de l'arrière-plan ne sont pas effacées. P>
aussi lorsque Repose de la vue L'image est étirée plutôt que de redessiner sans heurts. p> Comme vous pouvez le constater que l'image est en bas à gauche p>
3 Réponses :
let scaleFilter = CIFilter(name: "CILanczosScaleTransform")
scaleFilter?.setValue(ciImage, forKey: kCIInputImageKey)
scaleFilter?.setValue(scale, forKey: kCIInputScaleKey)
Merci, donc juste pour clarifier - avec le rendu des métaux un CIIMAGE, cela rendit-il simplement les pixels d'image indigène 1: 1 aux pixels de l'appareil quelle que soit la taille de la vue - de sorte que la vue ne change pas la taille de l'image rendue - je suis alwing Dons mettre à l'échelle de l'image moi-même si la taille de la vue change - Aucune mise à l'échelle automatique comme des calayeurs. Il est difficile de trouver une explication concise pour le dessin des métaux / le rendu des systèmes de coordonnées.
Le problème est votre appel à Placer le dessin dans le bon endroit est à vous. Vous devez travailler lorsque l'origine des limites de droite devrait être, sur la base des dimensions de l'image et de votre taille attirée, et de rendu là-bas. Si la taille est fausse, vous devez également appliquer une transformation d'échelle en premier. P> context.render code> - Vous appelez rendu code> avec limites: code> origine .zero code> .zero code >. C'est la gauche inférieure. P>
Exemple ici: Github.com/mattneub / Programmation-iOS-Book-Exemples / Blob / Maste R / ...
Merci, je ne trouve aucune explication concise des systèmes de coordonnées des utilisations métalliques - est-ce que tout simplement des pixels de périphérique et que tout doit être mis à l'échelle programmatique - aucune transformation comme des calayeurs?
CIIMAGE a transformé, comme je l'ai mentionné dans ma réponse. Mais sinon je ne suis pas sûr de ce que vous demandez. Un cIImage n'est pas une vue; C'est un ensemble d'instructions de dessin. Où dessiner est votre préoccupation.
Si l'image est 8000x5000 et que je le dis de rendre la vision de 2000X1500 en spécifiant les limites de (0,0,2000.1500), il ne permet pas d'adapter l'image pour s'adapter à la zone - on dirait qu'il dessine une image pixel à un pixel d'écran - ce qui ne va pas car il s'agit d'un écran de rétine. Utiliser des filtres à l'échelle ou des transformations et l'image devient floue et que la ration de l'aspect ne correspond plus à l'original - et le résultat final ne correspond pas à la MTKView correctement non plus.
"Ce qui ne va pas puisqu'il s'agit d'un écran de rétine" Avez-vous même regardé le code que je vous ai lié? Cela dépasse exactement ce motif.
J'ai fait et la qualité de l'image résultante est très mauvaise. De plus, je fais le dessin sur un thread d'arrière-plan afin que vous ne puissiez pas utiliser exactement les mêmes appels - je dois créer les appels dessinables et faire le dessin () sur un fil d'arrière-plan et ne peut pas accéder directement aux propriétés de la vue. Mais néanmoins en utilisant la même approche de base, une image de mauvaise qualité et un rapport d'image incorrect et incorrect. J'aurai une autre tentative cependant.
Eh bien, pour une meilleure mise à l'échelle, vous pouvez utiliser le filtre à l'échelle comme déjà suggéré.
Merci à TRISTAN HUME'S MetalTest2, je le fais maintenant fonctionner bien dans deux envies de défilement synchronisées. Les bases sont dans la sous-classe ci-dessous - le rendu et les shaders peuvent être trouvés au projet TRISTANESTST2. Cette classe est gérée par un mode de vue de la vue et est une sous-vision du document de ScrollView's Documentview. Voir l'image du résultat final.