Swift: размер изображения увеличивается после записи этого изображения в папку даже после сжатия изображения

Я сохраняю изображение, выбранное из фотографий, в папке документов.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

    guard let selectedImage = info[.originalImage] as? UIImage else {
        fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
    }
    selectedImage.jpegData(compressionQuality: 0.0).fileSize() //Printing size as 4284217 bytes|4.3 MB
    if let imageData = selectedImage.jpeg(.lowest) {
        imageData.fileSize() //Printing size as 4284217 bytes|4.3 MB
        let compressedImage = UIImage(data: imageData)?.fixOrientation()
        saveImageInDocuments(compressedImage!)
    }
    picker.dismiss(animated: true, completion: nil)
}

После выбора изображения и сжатия до минимального размера я напечатал размер изображения. Следующим шагом будет сохранение изображения в папку «Документы».

func saveImageInDocuments(_ image: UIImage) {
    let imageName = String(Date().toMillis())
    let fileURL = documentsDirectoryURL.appendingPathComponent("\(CUST_APP_DOC)/\(imageName).png")
    print(fileURL.path)

    if !FileManager.default.fileExists(atPath: fileURL.path) {
        do {
            try image.pngData()!.write(to: fileURL)                
            print("Saved filename: \(imageName).png size: \(calculateFileSize(path: String(describing: fileURL)).0)")
        } catch {
            print(error)
        }
    } else {
        print("Image Not Added")
    }
}

Методы, используемые для получения размера изображения и расчета размера изображения, сохраненного по пути

 func calculateFileSize(path: String) -> (String, Double) {
    let absolutePath = path.replacingOccurrences(of: "file://", with: "")
    let fileAttributes = try! FileManager.default.attributesOfItem(atPath: absolutePath)
    let fileSizeNumber = fileAttributes[FileAttributeKey.size] as! NSNumber
    let fileSize = fileSizeNumber.int64Value
    var sizeMB = Double(fileSize / 1024)
    sizeMB = Double(sizeMB / 1024)
    print(String(format: "%.2f", sizeMB) + " MB")
    return (String(format: "%.2f", sizeMB) + " MB", sizeMB)
}

extension Data {
    func fileSize() {
        let bcf = ByteCountFormatter()
        bcf.allowedUnits = [.useMB] // optional: restricts the units to MB only
        bcf.countStyle = .file
        let string = bcf.string(fromByteCount: Int64(self.count))
        print("Printing size as \(self.count) bytes|\(string) MB")
    }
}

Проблема в том, что после выбора изображения размер файла изображения составляет 4,3 МБ, а после сохранения изображения в папку. Размер изображения приближается к "Имя сохраненного файла: 1546593850872.png размер: 29,86 МБ"

Почему это происходит? Если кто-то может помочь объяснить это, я буду благодарен человеку.


person Aditya    schedule 04.01.2019    source источник
comment
Вам нужно сжать размер изображения, а затем сохранить его в каталоге документов, это то, что вы хотите сделать?   -  person Abhishek Jadhav    schedule 04.01.2019
comment
Здесь отсутствует информация. После проверки размера сжатых данных вы звоните .fixOrientation(), что это делает? что такое CreateUploadingPdf()??   -  person Scriptable    schedule 04.01.2019
comment
@Scriptable .fixOrientation() предназначен для изменения ориентации изображения. В моем случае ориентация изображения в некоторых случаях менялась. CreateUploadingPdf() Я удалил это, хотя это был класс, в котором был определен calculateFileSize().   -  person Aditya    schedule 04.01.2019
comment
@AbhishekJadhav Да, это то, что я делаю, но записываю это изображение в каталог. Размер изображения увеличивается.   -  person Aditya    schedule 04.01.2019


Ответы (1)


Поискав целый день, я нашел ответ на этот сценарий.

В didFinishPickingMediaWithInfo я сжимал изображение в JPEG, где размер изображения уменьшался. Затем, записывая изображение в каталог saveImageInDocuments, я снова преобразовывал изображение JPEG в PNG, используя эту строку кода.

try image.pngData()!.write(to: fileURL)

Преобразование изображения в PNG увеличивало его размер.

Для решения я изменил этот метод:

func saveImageInDocuments(_ imageData: Data) {
    let imageName = String(Date().toMillis())
    let fileURL = documentsDirectoryURL.appendingPathComponent("\(CUST_APP_DOC)/\(imageName).png")
    print(fileURL.path)

    if !FileManager.default.fileExists(atPath: fileURL.path) {
        do {
            try imageData.write(to: fileURL)                
         } catch {
            print(error)
        }
    } else {
        print("Image Not Added")
    }
}

Непосредственно сохраненное сжатое изображение JPEG.

person Aditya    schedule 05.01.2019