Frage Gedrehtes Bild wird verzerrt und verschwommen?


Ich benutze eine Bildansicht:

@IBOutlet weak var imageView: UIImageView!

um ein Bild und auch ein anderes Bild, das gedreht wurde, zu malen. Es stellt sich heraus, dass das gedrehte Bild eine sehr schlechte Qualität hat. Im folgenden Bild werden die Gläser in der gelben Box nicht gedreht. Die Gläser in der roten Box sind um 4,39 Grad gedreht.

enter image description here

Hier ist der Code, mit dem ich die Brille zeichne:

UIGraphicsBeginImageContext(imageView.image!.size)
    imageView.image!.drawInRect(CGRectMake(0, 0, imageView.image!.size.width, imageView.image!.size.height))

var drawCtxt = UIGraphicsGetCurrentContext()

var glassImage = UIImage(named: "glasses.png")
let yellowRect = CGRect(...)

CGContextSetStrokeColorWithColor(drawCtxt, UIColor.yellowColor().CGColor)
CGContextStrokeRect(drawCtxt, yellowRect)
CGContextDrawImage(drawCtxt, yellowRect, glassImage!.CGImage)

// paint the rotated glasses in the red square
CGContextSaveGState(drawCtxt)
CGContextTranslateCTM(drawCtxt, centerX, centerY)
CGContextRotateCTM(drawCtxt, 4.398 * CGFloat(M_PI) / 180)
var newRect = yellowRect
newRect.origin.x = -newRect.size.width / 2
newRect.origin.y = -newRect.size.height / 2
CGContextAddRect(drawCtxt, newRect)
CGContextSetStrokeColorWithColor(drawCtxt, UIColor.redColor().CGColor)
CGContextSetLineWidth(drawCtxt, 1)

// draw the red rect
CGContextStrokeRect(drawCtxt, newRect)
// draw the image
CGContextDrawImage(drawCtxt, newRect, glassImage!.CGImage)
CGContextRestoreGState(drawCtxt)

Wie kann ich die Brille drehen und bemalen, ohne Qualität zu verlieren oder ein verzerrtes Bild zu bekommen?


5
2018-04-20 17:41


Ursprung


Antworten:


Du solltest benutzen UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale) um den ursprünglichen Kontext zu erstellen. Einfahren 0.0 als die scale wird standardmäßig auf den Maßstab des aktuellen Bildschirms gesetzt (z. B. 2.0 auf einem iPhone 6 und 3.0 auf einem iPhone 6 Plus).

Siehe diesen Hinweis auf UIGraphicsBeginImageContext():

Diese Funktion entspricht dem Aufruf der Funktion UIGraphicsBeginImageContextWithOptions mit dem opaken Parameter NO und einem Skalierungsfaktor von 1.0.


3
2018-04-20 17:47



Wie andere darauf hingewiesen haben, müssen Sie Ihren Kontext einrichten, um Retina-Displays zu ermöglichen.

Abgesehen davon möchten Sie möglicherweise ein Quellbild verwenden, das größer als die Zielanzeigegröße ist, und es verkleinern. (2-fache Pixelgröße des Zielbildes wäre ein guter Ausgangspunkt.)

In ungerade Winkel zu drehen ist destruktiv. Die Grafik-Engine muss ein Raster von Quellpixeln auf ein anderes Raster abbilden, in dem sie nicht ausgerichtet sind. Perfekt gerade Linien im Quellbild nicht mehr direkt im Zielbild usw. Die Grafik-Engine hat eine Interpolation zu tun, und ein Quellenpixel könnte über mehrere Pixel verteilt werden, oder weniger als ein volles Pixel im Zielbild.

Indem Sie ein größeres Quellbild bereitstellen, geben Sie der Grafik-Engine mehr Informationen, mit denen Sie arbeiten können. Es kann diese Quellpixel besser in das Zielraster von Pixeln schneiden und würfeln.


1
2018-04-20 17:53