Blaska
Blaska

Reputation: 1

Unable to save images in the right directory

I am trying to save images in a directory. Images are correctly saved in the right place, but when I inspect these with the path in the finder, all the images are damaged and unsable.

damaged images

Below the static method:

static func writeImageFile(with data: Data, issue: Issue, page: Int, isThumbnail: Bool) throws -> URL {
    let url = MediaFileManager.issueImagesDirectoryURL(issue: issue).ensuringDirectoryExists()
    let imageURL = url.appendingPathComponent(imageName(for: page, isThumbnail: isThumbnail))
    try data.write(to: imageURL)
    return url
}

And the call in the class:

    DispatchQueue.main.async {
        guard let data = result.data else {
            self.downloadDidFail(for: result.page)
            return
        }
        do {
            let writeImageFile = try MediaFileManager.writeImageFile(with: data, issue: self.issue, page: result.page, isThumbnail: false)
            let writeThumbFile  = try MediaFileManager.writeImageFile(with: data, issue: self.issue, page: result.page, isThumbnail: true)
            print(writeImageFile)
            print(writeThumbFile)
        } catch let error as NSError {
            print(error.localizedDescription)
        }
    }

Upvotes: 0

Views: 39

Answers (2)

Mihai Erős
Mihai Erős

Reputation: 1157

I will assume, since you don't quite specify this, that you have a bunch of UIImage objects. And I also noticed that you want your images to be saved as JPEG, which is no trouble at all, don't worry.

I would go with something like this:

if let image = UIImage(named: "example.png") {
    if let data = UIImageJPEGRepresentation(image, 1.0) {
        let filename = getDocumentsDirectory().appendingPathComponent("copy.png")
        try? data.write(to: filename)
    }
}

Where the func getDocumentsDirectory() is the following:

func getDocumentsDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    return paths[0]
}

You might wonder why I used 1.0 for the second parameter in UIImageJPEGRepresentation, well that's the JPEG quality mapped between 0.0 and 1.0 (it's a float).

If you have any details that I am not aware of, please reply and I will try to help accordingly. Hope it helps you, cheers!

Source: link

Upvotes: 1

Pedro Cavaleiro
Pedro Cavaleiro

Reputation: 932

Have you tried to load the image to a UIImageView to see if the images are being properly downloaded? imageView.image = UIImage(data: data).

But I also detect that you're saving Data instead of the image, in order to make sure that you're saving an image I would try the following

static func writeImageFile(with data: Data, issue: Issue, page: Int, isThumbnail: Bool) throws -> URL {
    let url = MediaFileManager.issueImagesDirectoryURL(issue: issue).ensuringDirectoryExists()
    let imageURL = url.appendingPathComponent(imageName(for: page, isThumbnail: isThumbnail))
    let image = UIImage(data: data)
    let imgData = UIImageJPEGRepresentation(image, 1)
    try imgData.write(to: imageURL)
    return url
}

Yes, it might have unnecessary steps, worth trying, this way we're making sure that it's saved as Jpeg. But again, I would check if the images are being properly downloaded first.

Upvotes: 0

Related Questions