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 MB, но докато след запазване на изображението в папка. Размерът на изображението идва "Име на запазен файл: 1546593850872.png размер: 29,86 MB"

Защо се случва това? Ако някой може да помогне с обяснението на това, ще съм му благодарен.


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