2009-12-07 3 views
0

je dois masque une image « texture » avec un mis en rotation l'image en échelle de gris.Les anticrénelage de pivotée CGImage/CGlayer semble Jaggy, UIImageView ce n'est pas

j'ai découvert que je dois le faire avec CGImages ou CGlayers (s'il existe un moyen de plus simple en utilisant UIImageViews seulement, s'il vous plaît laissez-moi savoir à ce sujet).

Mon problème est simple:

Les anticrénelage de toute substance CG transformé en rotation est calme Jaggy ...

... mais les anticrénelage d'un UIImageView, transformé en rotation, est un peu parfait. Comment puis-je produire de belles rotations anti-aliasées?

J'ai uploadé une "preuve" impliquant des captures d'écran réelles iPhone Simulator, pour voir ce que je talkin' about: http://gotoandplay.freeblog.hu/files/Proof.png

J'ai essayé d'utiliser CGImages, CGLayers, UIImageViews " capturé » avec renderInContext, j'ai essayé de CGContextSetInterpolationQuality à haut, et aussi essayé de mettre CGContextSetAllowsAntialiasing - CGContextSetShouldAntialias, mais chaque cas retourné le même résultat jaggy.

Je prévois d'apprendre à utiliser OpenGL l'année prochaine, mais ce développement devrait être publié uniquement avec CoreGraphics. S'il vous plaît laissez-moi savoir comment obtenir une image pivotée parfaitement rendue, je ne peux tout simplement pas accepter c'est impossible.

+0

Personne ne sait ... – Geri

+0

Salut geri, avez-vous trouvé une solution à ce problème? Je suis confronté à des problèmes similaires ici: http://stackoverflow.com/questions/2590470/how-do-i-remove-those-rotation-artefacts-from-my-catiledlayer – FelixLam

+0

Ya. Chaque solution était vraiment exigeante en termes de performances, j'ai donc décidé d'apprendre l'API OpenGL ES. Ce n'est pas un gros problème, et le jeu devient vraiment lisse à la fois dans les antialias, et la performance. – Geri

Répondre

0

Avez-vous essayé d'ajouter une bordure transparente de 1 pixel autour de votre image? J'en ai entendu parler comme une astuce pour éviter l'aliasing, en donnant à CoreGraphics une certaine marge de manœuvre pour mélanger les bords.

1

Pour ajouter 1px frontière transparente à l'utilisation de l'image de cette

CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height); 
UIGraphicsBeginImageContext(imageRect.size); 
[image drawInRect:CGRectMake(1,1,image.size.width-2,image.size.height-2)]; 
image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
0

J'ai un problème similaire, on dirait que je vais le déplacer vers OpenGL ES ainsi. Je ne peux pas trouver une solution efficace qui ne nuise pas aux performances. Pour la référence des futurs explorateurs CoreGraphics, la mise en place d'une bordure transparente de 1 pixel a permis d'améliorer sensiblement mes expériences, mais il semble que, comme l'a mentionné Eonil, on aboutisse à plusieurs étapes d'antialiasing/lissage/interpolation L'un et l'autre. IE: CGLayer fait une interpolation pour sa rotation, puis le contexte dans lequel il est dessiné va faire une interpolation/antialiasing, et ainsi de suite jusqu'à ce qu'il finisse par avoir l'air plutôt rugueux.

En fait, je me suis retrouvé avec de meilleurs résultats en désactivant l'interpolation et l'anti-crénelage sur le contexte de destination, bien qu'il soit toujours manifestement jaggy (moins d'artefacts cependant).J'ai été en mesure d'obtenir la meilleure apparence globale en permettant l'interpolation et l'antialiasing lors de la construction du CGLayer, et en le désactivant pour le contexte de destination lors du nouveau dessin. Cette approche, évidemment, est lourde d'autres problèmes.

Questions connexes