2017-08-19 5 views
-1

Ich möchte den aktuellen Bildschirm in einem Bild erfassen. Ich tue dies:UIGraphicsBeginImageContext gibt kein Retinabild zurück

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.isOpaque, UIScreen.main.scale) 
self.view.drawHierarchy(in: self.view.bounds, afterScreenUpdates: false) 
let snapshot = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

Problem ist der Skalenparameter. Wenn ich richtig verstehe, repräsentiert 0.0 die Nicht-Retina, 2.0 die Retina und 3.0 die Retina für 6 Plus und 7 Plus. Egal, was ich in den Skalierungsparameter eingabe, der Ausgang ist immer ein Bild mit 375x667 Auflösung. Ich habe auch anderen Ansatz versucht:

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.isOpaque, UIScreen.main.scale) 
self.view.layer.render(in: UIGraphicsGetCurrentContext()!) 
let snapshot: UIImage? = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

Wieder dasselbe Szenario. Ich verwende auch

UIScreen.main.scale

die in der Tat kehrt 2.0 zu schätzen wissen. Was mache ich falsch? Wie bekomme ich ein Bild mit höherer Auflösung?

+0

Eigentlich bedeutet 0.0 die tatsächliche Bildschirmskala, nicht nicht-Retina. Das ist 1.0. – the4kman

+0

Wie bestimmen Sie die "Größe" des resultierenden Bildes? –

+0

Was bedeutet "Auflösung"? Die einzige Sache, die sich unterscheiden würde, ist die resultierende Skalierung der UIImage. Die Größe wird in Punkten gemessen, nicht in Pixeln. es ist das gleiche für alle Skalen. – matt

Antwort

0

nur etwa Skala ist es egal, sie kümmern sich um Größe

let contextSize = CGSize(width: self.view.bounds.size.width * UIScreen.main.scale, height: self.view.bounds.size.height * UIScreen.main.scale) 

UIGraphicsBeginImageContextWithOptions(contextSize, self.view.isOpaque, UIScreen.main.scale) 
self.view.layer.render(in: UIGraphicsGetCurrentContext()!) 
let snapshot: UIImage? = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

CGContext den Trick Dieser Code wird.

EDIT

Sie können das neuere API verfügbar in iOS 10 verwenden und später

let renderer = UIGraphicsImageRenderer(bounds: self.view.bounds) 

let snapshot = renderer.image(actions: { context in 
    self.view.layer.render(in: context.cgContext) 
}) 
+0

Das hat das gerade getan: http://i.imgur.com/hKXsmkY.jpg (blau ist der Screenshot) – MHCsk

+0

Versuchen Sie, ** 0 ** als Maßstab – Karim

+0

noch immer das gleiche. – MHCsk

0

Snapshot ist ein UIImage, die zwei Eigenschaften, size und scale; ähnlich wie der Bildschirm. Um die tatsächliche Größe in Pixel des Bildes zu bestimmen, müssen Sie die Größe mit der Skala multiplizieren. Ich denke, Ihr Problem ist, dass Sie davon ausgehen, dass die Größeneigenschaft Pixel keine Punkte ist.

size
Die logischen Dimensionen des Bildes, in Punkten gemessen.

Sie können dies testen in einem sehr definitive Weise durch eine JPG-Erstellung UIImageJPEGRepresentation verwenden und es auf dem Datenträger gespeichert unter Verwendung von Bild Tools überprüfen Sie mit vertraut sind.

0

Das Problem ist, dass Ihre Erwartungen falsch sind; Du verstehst nicht, was Auflösung ist. Das size ist das gleiche für ein 1x Bild, sein entsprechendes 2x Bild und sein entsprechendes 3x Bild. Was unterscheidet, ist die scale des Bildes; Wenn Sie sich das ansehen, werden Sie sehen, dass es sich richtig ändert.

Wenn Sie dies selbst beweisen möchten, wandeln Sie das UIImage in ein CGImage um und betrachten Sie die Größe , die ist. Jetzt können Sie die Abmessungen der zugrunde liegenden Bitmap sehen.

Verwandte Themen