2009-08-01 7 views
5

ich mit dem folgenden Code mein Bild am Dreh:Mein gedrehtes Bild hat keine scharfen Kanten

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

Aber es hat keine scharfen Kanten, weiß jemand eine Lösung für dieses?

Hier ist das Bild, das ich bekommen:

enter image description here

Antwort

2

Die Ränder des Bildes selbst sehen gezackt aus, weil sie direkt in ein Pixelraster platziert werden und nicht interpoliert werden. Nearest Neighbor Interpolation ist die einfachste Art der Interpolation. Wenn Sie das Pixelraster A haben und das Bild in das Pixelraster B bewegen, werden die Pixel im Raster B einfach durch Auswahl des nächstliegenden Pixels aus Raster A ausgewählt. Andere Interpolationsformen wählen einen gewichteten Durchschnitt der nächstgelegenen Pixel, um den Pixelwert in Raster B zu erhalten.

Ihr Bild mit seinen gezackten Kanten sieht so aus, als würde es Interpolation am nächsten Nachbarn verwenden. Dies ist möglicherweise der Standardtyp der Interpolation bei einer affinen Transformation auf einem iPhone.

Wenn Sie ein anderes Interpolationsschema als den nächsten verwenden, erhalten Sie aliasing Effekte, wobei das Subsampling nicht perfekt ist, wenn Sie von einem Pixelraster zu einem anderen übertragen. Dieser Effekt lässt Kanten im Bild selbst verschwommen erscheinen, als sie es sonst tun würden.

+0

Vielen Dank für Ihre Erklärung, aber wissen Sie, wie ich das in objektiven c für das iPhone tun kann. – Ton

+0

Vielleicht versuchen Sie, CGInterpolationQuality auf kCGInterpolationHigh – mmr

+1

Haben Sie ein Beispiel auf ho diesen Wert zu setzen. Ich habe gerade meine ImageView mit einem UIImage drinnen wissen. – Ton

1

Immer, wenn Sie auf ein Bild machen verwandelt (außer in 90 ° -Schritten) etwas weichere Kanten aufgrund Bildpunktinterpolation verursachen wird.

+0

Oke, aber ich glaube nicht, mein Bild leichte weichere Kanten hat, es sieht wirklich hässlich !, könnte man einen Blick auf das Bild und mir sagen, ob man seine normale denken? Ich habe den Link in meine Frage eingefügt. – Ton

2

fügen Sie einfach 1px transparent Grenze zu Ihrem Bild

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

den CALayer des UIImageView Mit dem Bild rastern das beste Anti-Aliasing liefern.

imageView.layer.shouldRasterize = YES; 
+0

Funktioniert perfekt! Vielen Dank! – DonnaLea

+0

Das funktionierte perfekt für mich. Fixed jaggies auf einer regulären UIView w/Hintergrundfarbe, um ein paar Grad gedreht. – mattorb