2017-05-11 2 views
0

Guten AbendWie kann man skalierte Bilder speichern?

Ich versuche, die Größe der Bilder in Documents Directory zu speichern, um die Größe bei jedem Aufruf nicht zu ändern.

das Problem zu analysieren ist nur, wenn ich die folgende Zeile verwenden:

let jpgImageData = UIImageJPEGRepresentation (image, 1.0) 

Es scheint, dass UIImageJPEGRepresentation die Änderungen an das Bild rückgängig gemacht und so speichert das Bild im gleichen Verhältnis.

Wer weiß, wie man das beheben kann?

Unter dem Code:

import UIKit 
class ViewController: UIViewController { 
    @IBOutlet weak var imgView: UIImageView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     let myImageName = "image_10001.jpg" 
     let imagePath = fileInDocumentsDirectory(filename: myImageName) 
     if let image = UIImage(named:"image_10001")?.resizedImage(newSize: UIScreen.main.bounds.size){ 
      print("Image : \(image.size.height)") 
      _ = saveImage(image: image, path: imagePath) 
     } 
     if let loadedImage = loadImageFromPath(path: imagePath){ 
      print("Screen: \(UIScreen.main.bounds.size.height)") 
      print("Image Size: \(loadedImage.size.height)") 
    //   let image = UIImageJPEGRepresentation(loadedImage, 0.9) 
    //   let imgRes = UIImage(data: image!)?.resizedImage(newSize: UIScreen.main.bounds.size) 
    ////    
    //   let load = loadedImage.resizedImage(newSize: UIScreen.main.bounds.size) 
    //    
    //   print("Load: \(load.size.height)") 
    //    
    //   _ = saveImage(image: load, path: imagePath) 
    //    
      imgView.image = loadedImage 
    // 
    //   imgView.image = UIImage(data: image!)?.resizedImage(newSize: UIScreen.main.bounds.size) 
     } 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    func loadImageFromPath(path: String) -> UIImage? { 
     let image = UIImage(contentsOfFile: path) 
     if image == nil { 
      print("missing image at: \(path)") 
     } 
     print("Loading image from path: \(path)") // this is just for you to see the path in case you want to go to the directory, using Finder. 
     return image 
    } 
    func getDocumentsURL() -> URL { 
     let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] 
     return documentsURL 
    } 
    func fileInDocumentsDirectory(filename: String) -> String { 
     let fileURL = getDocumentsURL().appendingPathComponent(filename) 
     return fileURL.path 
    } 
    func saveImage (image: UIImage, path: String) -> Bool{ 
     print("Save") 
     let url = URL(fileURLWithPath: path) 
    //  let pngImageData = UIImagePNGRepresentation(image) 
     let jpgImageData = UIImageJPEGRepresentation(image, 1.0) // if you want to save as JPEG 
     let img = UIImage(data:jpgImageData!) 
    //   
      print("SIMG: \(String(describing: img?.size.height))") 
     do { 
      _ = try jpgImageData?.write(to: url, options: .atomicWrite) 
      print("Save Success") 
     } catch let error { 
      print(error) 
      return false 
     } 
     return true 
    } 
    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

extension UIImage { 
    /// Returns a image that fills in newSize 
    func resizedImage(newSize: CGSize) -> UIImage { 
     // Guard newSize is different 
     guard self.size != newSize else { return self } 
     UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0); 
     self.draw(in: CGRect(x:0, y:0, width:newSize.width, height: newSize.height)) 
     let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
     UIGraphicsEndImageContext() 
     return newImage 
    } 
    /// Returns a resized image that fits in rectSize, keeping it's aspect ratio 
    /// Note that the new image size is not rectSize, but within it. 
    func resizedImageWithinRect(rectSize: CGSize) -> UIImage { 
     let widthFactor = size.width/rectSize.width 
     let heightFactor = size.height/rectSize.height 
     var resizeFactor = widthFactor 
     if size.height > size.width { 
      resizeFactor = heightFactor 
     } 
     let newSize = CGSize(width:size.width/resizeFactor, height:size.height/resizeFactor) 
     let resized = resizedImage(newSize: newSize) 
     return resized 
    } 
    var jpeg: Data? { 
     return UIImageJPEGRepresentation(self, 1) // QUALITY min = 0/max = 1 
    } 
    var png: Data? { 
     return UIImagePNGRepresentation(self) 
    } 
} 

extension Data { 
    var uiImage: UIImage? { 
     return UIImage(data: self) 
    } 
} 
+0

Mögliche Duplikat [UIImageJpgRepresentation verdoppelt Bildauflösung] (http://stackoverflow.com/questions/43704615/uiimagejpgrepresentation-doubles-image-resolution) –

Antwort

0

Ich nehme an, Sie haben einige "alte" Bild in Ihrem Dokumentenverzeichnis, die Sie hatten mit einigen älteren Code gespeichert wurde (nicht in der Größe geändert).

Ich gehe davon aus, dass, weil der Code, den Sie geschrieben werden keine neue Bilder speichern, weil diese Linie:

if let image = UIImage(named:"image_10001")?.resizedImage(newSize: UIScreen.main.bounds.size){ 
    //resize code 
} 

Ich glaube, Sie hier gleiches Bild Namen von Bündel nur genommen verwenden wollten:

if let image = UIImage(named: myImageName)?.resizedImage(newSize: UIScreen.main.bounds.size){ 
    //resize code 
} 

Sie können den Inhalt des Simulators zurücksetzen und sicherstellen, dass kein Bild mit dem Code, den Sie hier gepostet haben, geladen wird.

+0

Frau Krukowski So ist der Code funktioniert gut, das Problem ist genau nennen i let jpgImageData = UIImageJPEGRepresentation (Bild, 1.0) Vor dieser Zeile hat mein Bild die Proportionen in der Größe geändert, aber wenn ich diese Zeile anrufe und ein Bild zB let img = UIImage (data: jpg) .size.height, hat dieses Bild die normale Größe. Der ganze Rest funktioniert gut –

+0

Für mich hat alles gut funktioniert. Speichern zeigt 2208.0, Lade Bild zeigt: 2208.0. Was zeigen Ihre Drucke? –

+0

So fand ich das Problem Frau Krukowski In diesem Thema: http://stackoverflow.com/questions/43704615/uiimagejpgrepresentation-doubles-image-resolution?noredirect=1&lq=1 Die UIImageJPEGRepresentation doppelte Bildgröße, da die Skala ist nicht eingestellt. Also mein Bild, wenn ich die Größe zum Beispiel 1000, wenn ich das Bild laden erscheinen 2000, aber die Skala ist 1 und nicht 2. Also sowieso muss ich das Bild ändern –

Verwandte Themen