Question

Je fais pivoter mon image avec le code suivant:

CGAffineTransform rotate = CGAffineTransformMakeRotation( [ratio floatValue] );
[imageView setTransform:rotate];

Mais il n’a pas d’arêtes vives, est-ce que quelqu'un connaît une solution à cela?

Voici l'image que je reçois:

entrer la description de l'image ici

Était-ce utile?

La solution

Les bords de l’image elle-même sont irréguliers car ils sont directement placés dans une grille de pixels et non interpolés. L'interpolation du voisin le plus proche est le type d'interpolation le plus simple. Dans le cas où vous avez la grille de pixels A et vous déplacez votre image vers la grille de pixels B, les pixels de la grille B sont choisis simplement en choisissant le pixel le plus proche de la grille A. Les autres formes d'interpolation choisissent une moyenne pondérée des pixels les plus proches pour obtenir la valeur de pixel dans la grille B

Votre image, avec ses bords dentelés, semble utiliser l’interpolation du voisin le plus proche, qui peut être le type d’interpolation par défaut lors d’une transformation affine sur un iphone.

Lorsque vous utilisez un autre schéma d'interpolation autre que le plus proche voisin, vous obtenez un aliasing . effets, où le sous-échantillonnage n'est pas parfait lorsque vous passez d'une grille de pixels à une autre. Cet effet rend les contours de l’image elle-même plus flous qu’ils ne le seraient autrement.

Autres conseils

Utiliser la couche CAL de UIImageView pour pixelliser l’image fournira le meilleur antialiasing.

imageView.layer.shouldRasterize = YES;

ajoutez simplement une bordure transparente de 1 pixel à votre image

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();

Chaque fois que vous effectuez une transformation sur une image (sauf par incréments de 90 °), les bords sont légèrement plus doux en raison de l'interpolation de pixels.

Il existe une clé que vous pouvez définir dans Info.plist qui active l'antialiasing des bords: UIViewEdgeAntialiasing.

Comme décrit dans la réponse suivante: Lorsque je fais pivoter un UIImageView avec la propriété transform, les bords sont pixellisés

La solution la plus simple:

  

Ajoutez simplement cette paire clé-valeur à votre Info.plist:   UIViewEdgeAntialiasing défini sur YES.

https://stackoverflow.com/a/12066215/1469060

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top