Mein gedrehtes Bild hat keine scharfen Kanten
-
07-07-2019 - |
Frage
Ich bin Dreh mein Bild mit dem folgenden Code:
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:
Lösung
Die Ränder des Bildes selbst gezackt aussehen, weil sie direkt in ein Pixelgitter platziert wird und nicht interpoliert werden. Nearest Neighbor Interpolation ist die einfachste Art der Interpolation, wo, wenn Sie Pixelraster A haben und Sie Ihr Bild Pixelraster B bewegen, werden die Pixel in Raster B einfach durch die Wahl des nächsten Pixels von Raster A. Andere Formen der Interpolation wählen einen gewichteten Durchschnitt der nächsten Pixel auf dem Pixelwert in Gitter B ankommen gewählt.
Ihr Bild mit seinen gezackten Kanten, sieht aus wie es nächste Nachbar-Interpolation verwendet, die den Standardtyp der Interpolation auf einem affinen auf einem iPhone umwandeln können.
Wenn Sie eine andere Interpolationsverfahren andere als nächsten Nachbarn, die Sie erhalten Aliasing Effekte, wo der Unterabtastungs nicht perfekt ist, wie Sie von einem Pixelraster auf einem anderen übertragen. Dieser Effekt macht Kanten im Bild selbst scheinen unschärfer als sie es sonst tun würde.
Andere Tipps
Das CALayer des UIImageView Mit dem Bild rastern das beste Anti-Aliasing liefern.
imageView.layer.shouldRasterize = YES;
nur 1px transparent Grenze zu Ihrem Bild hinzufügen
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();
Immer, wenn Sie wandelt auf ein Bild machen (außer in 90 ° -Schritten) etwas weichere Kanten aufgrund Bildpunktinterpolation verursachen wird.
Es gibt einen Schlüssel, den Sie in Info.plist festlegen können, Anti-Aliasing der Kanten ermöglicht. UIViewEdgeAntialiasing
Wie in der folgenden Antwort beschrieben:
Die einfachste Lösung: Fügen Sie einfach dieses Schlüssel-Wert-Paar zu Ihrem Info.plist:
auf YES gesetzt UIViewEdgeAntialiasing.