2016-06-15 4 views
0

Ich bin auf der Suche nach einer Lösung, um eine UIView (mit ihren Unteransichten) zu speichern, die als Bild in der Fotobibliothek der Geräte gespeichert wird. Ich möchte, dass die Größe des Ausgabebildes 1024 x 1024 ist. Die UIView wird immer ein Quadrat sein, so dass Subviews in das Quadrat passen. Die resultierende gespeicherte Ausgabe muss diese Anforderungen erfüllen.Skalierung von Ansicht und Bild mit UIGraphicsBeginImageContextWithOptions

Hier ist, was ich habe:

let outputSize = CGSize(width: 1024.0, height: 1024.0) 

func imageWithView(view: UIView) -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(outputSize, view.opaque, 0.0) 
    view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: false) 
    let outputImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return outputImage 
} 

Die Ansicht, die ich in den Parameter oben am Übergang der Blick auf den Platz ist. Der Screenshot unten ist das Ergebnis:

crop scale is off

In meinem Drehbuch, die UIView Platz ist bei 280x280 (wenn das einen Unterschied macht.) Mein gewünschtes Ergebnis ist die UIView (und innerhalb Foto davon) gespeichert wird die Vollgröße des schwarzen Rahmens (1024 Quadrat). Danke für die Hilfe.

bearbeiten

Hier ist eine aktualisierte Version: Während es die Bedürfnisse der Ausgabe der Blick auf 1024 Quadrat erfüllt, die Qualität ist nicht sehr wünschenswert ist. Möchten die CGBitmapContextCreate & CGContextDrawImage Methode hier besprochen verwenden: http://nshipster.com/image-resizing/

func stackOverflow() -> UIImage{ 

    let hasAlpha = false 
    let scale: CGFloat = 1.0 

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(1024.0, 1024.0), !hasAlpha, scale) 

    mainView.drawViewHierarchyInRect(CGRect(origin: CGPointZero, size: CGSizeMake(1024.0, 1024.0)), afterScreenUpdates: false) 

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return scaledImage 
} 

Antwort

0

Sie können es auf diese Weise tun:

let image = UIImage(contentsOfFile: self.URL.absoluteString!) 

let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(0.5, 0.5)) 
let hasAlpha = false 
let scale: CGFloat = 0.0 // Automatically use scale factor of main screen 

UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale) 
image.drawInRect(CGRect(origin: CGPointZero, size: size)) 

let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

Wie here gezeigt.

+0

Überprüfen Sie meine Bearbeitung oben. Ich musste ein paar Dinge anpassen, damit es mit meinen Bedürfnissen zusammenpasst. Während das endgültige Bild auf 1024 Quadrat exportiert wird, ist die Bildqualität nicht sehr wünschenswert. Der von Ihnen bereitgestellte NSHipster-Link sieht aus wie eine robustere Lösung mit: CGBitmapContextCreate & CGContextDrawImage - dies ermöglicht mir, die Qualität mit CGInterpolationQuality anzugeben. Ich habe Schwierigkeiten damit, das UIView und seine Subviews zu exportieren, da es nach einem CGImage-Argument sucht. Können Sie mir Tipps geben, wie Sie diese für meine oben genannten Anforderungen nutzen können? Vielen Dank. – Joe

+0

Was passiert eigentlich? Sie können das UIImage nicht in CGImage konvertieren oder was? Sie können das mit 'UIImage (Name:" Something ")?. CGImage' machen und den Rest der Prozedur dort befolgen. – Dershowitz123

+0

Ich habe die UIImage als CGImage gecastet, also funktioniert das gut. Das Problem besteht darin, die quadratische UIView in die Methode einzufügen. Ich glaube, dass es in CGContextDrawImage oder CGBitmapCreateImage hinzugefügt werden muss, aber nichts, das ich versuchte, produzierte irgendwelche würdigen Resultate. – Joe