2009-08-01 12 views
5

sto ruotando la mia immagine con il seguente codice:La mia immagine ruotata non ha spigoli vivi

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

Ma non ha spigoli vivi, Qualcuno sa una soluzione per questo?

Ecco l'immagine ottengo:

enter image description here

risposta

2

I bordi dell'immagine stessa appaiono frastagliati perché vengono inseriti direttamente in una griglia di pixel e non vengono interpolati. Nearest Neighbor Interpolation è il tipo più semplice di interpolazione, in cui se si dispone della griglia di pixel A e si sposta 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 bordi frastagliati, sembra utilizzare l'interpolazione più vicina, che potrebbe essere il tipo predefinito di interpolazione su una trasformazione affine su un iphone.

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

+0

Grazie per la tua spiegazione, ma sai come posso farlo nell'obiettivo c per l'iphone. – Ton

+0

Forse prova a impostare CGInterpolationQuality su kCGInterpolationHigh – mmr

+1

Hai un esempio su ho per impostare quel valore. Ho solo il mio imageView con una UIImage al suo interno. – Ton

1

Ogni volta che si fa si trasforma in un'immagine (tranne che in incrementi di 90 °) che sta per causare bordi leggermente più morbide a causa di interpolazione dei pixel.

+0

Oke, ma non credo che la mia immagine ha lievi più morbida bordi, sembra davvero brutto !, si potrebbe dare un'occhiata all'immagine e dimmi se si pensa che la sua normale? ho incluso il link nella mia domanda. – Ton

2

basta aggiungere confine 1px trasparente per la vostra 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(); 
11

Utilizzando CALayer del UIImageView per rasterizzare l'immagine fornirà il miglior antialiasing.

imageView.layer.shouldRasterize = YES; 
+0

Funziona perfettamente! Grazie! – DonnaLea

+0

Questo ha funzionato perfettamente per me. Risolti i bordi su un normale UIView con colore di sfondo, ruotato di alcuni gradi. – mattorb

Problemi correlati