Domanda

Sto ruotando la mia immagine con il seguente codice:

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

Ma non ha spigoli vivi, qualcuno conosce una soluzione per questo?

Ecco l'immagine che ottengo:

inserisci qui la descrizione dell'immagine

È stato utile?

Soluzione

I bordi dell'immagine stessa sembrano frastagliati perché vengono posizionati direttamente in una griglia di pixel e non vengono interpolati. Interpolazione vicina più vicina è il tipo più semplice di interpolazione, dove se si dispone della griglia di pixel A e sposti l'immagine sulla griglia di pixel B, i pixel nella griglia B vengono scelti semplicemente scegliendo il pixel più vicino dalla griglia A. Altre forme di interpolazione scelgono una media ponderata dei pixel più vicini per arrivare al valore del pixel nella griglia B.

L'immagine, con i suoi bordi frastagliati, sembra che stia utilizzando l'interpolazione del vicino più vicino, che potrebbe essere il tipo predefinito di interpolazione su una trasformazione affine su un iPhone.

Quando usi un altro schema di interpolazione diverso dal vicino più vicino, otterrai aliasing effetti, in cui il sottocampionamento non è perfetto quando si trasferisce da una griglia di pixel a un'altra. Tale effetto rende i bordi dell'immagine stessa più sfocati di quanto non farebbero altrimenti.

Altri suggerimenti

L'uso del CALayer di UIImageView per rasterizzare l'immagine fornirà il miglior antialiasing.

imageView.layer.shouldRasterize = YES;

aggiungi solo un bordo trasparente 1px alla tua immagine

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

Ogni volta che si trasforma in un'immagine (tranne con incrementi di 90 & # 176;) causerà bordi leggermente più morbidi a causa dell'interpolazione dei pixel.

C'è una chiave che puoi impostare in Info.plist che abilita l'antialiasing dei bordi: UIViewEdgeAntialiasing.

Come descritto nella seguente risposta: Quando ruoto un UIImageView con la proprietà transform, i bordi pixellate

La soluzione più semplice:

  

Aggiungi semplicemente questa coppia chiave-valore al tuo Info.plist:   UIViewEdgeAntialiasing impostato su YES.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top