webentwicklung-frage-antwort-db.com.de

Wie bekomme ich die Bildgröße in Swift?

Ich benutze 

UIImagePickerControllerDelegate,
UINavigationControllerDelegate,
UIPopoverControllerDelegate

diese Delegierten, um ein Bild aus meiner Galerie oder meiner Kamera auszuwählen. Wie kann ich also die Bilddateigröße nach der Auswahl eines Bildes erhalten?

Ich möchte das verwenden:

let filePath = "your path here"
    var fileSize : UInt64 = 0

    do {
        let attr : NSDictionary? = try NSFileManager.defaultManager().attributesOfItemAtPath(filePath)

        if let _attr = attr {
            fileSize = _attr.fileSize();
            print(fileSize)
        }
    } catch {
    }

aber hier brauche ich einen Pfad, aber wie komme ich ohne Pfad, nur per Image-Datei?

22
Orkhan Alizade
  var image = info[UIImagePickerControllerOriginalImage] as! UIImage
    var imgData: NSData = NSData(data: UIImageJPEGRepresentation((image), 1)) 
// var imgData: NSData = UIImagePNGRepresentation(image) 
// you can also replace UIImageJPEGRepresentation with UIImagePNGRepresentation.
    var imageSize: Int = imgData.length
    print("size of image in KB: %f ", Double(imageSize) / 1024.0)
57
Dhaivat Vyas

Swift 3/4:

if let imageData = UIImagePNGRepresentation(image) {
     let bytes = imageData.count
     let kB = Double(bytes) / 1000.0 // Note the difference
     let KB = Double(bytes) / 1024.0 // Note the difference
}

Bitte beachten Sie den Unterschied zwischen KB und KB. Antworten hier, weil in meinem Fall ein Problem aufgetreten ist, während Kilobyte als 1024 Bytes angesehen wurde, während es auf der Serverseite als 1000 Bytes angesehen wurde, was zu einem Problem führte. Link um mehr zu erfahren.

PS. Fast sicher geht es mit kB (1000).

6
Tung Fam

Swift 3

let uploadData = UIImagePNGRepresentation(image)
let array = [UInt8](uploadData)
print("Image size in bytes:\(array.count)")
3
JP Aquino
let selectedImage = info[UIImagePickerControllerOriginalImage] as!  UIImage 
let selectedImageData: NSData = NSData(data:UIImageJPEGRepresentation((selectedImage), 1)) 
let selectedImageSize:Int = selectedImageData.length 
print("Image Size: %f KB", selectedImageSize /1024.0)
1
Adarsh G J

Versuchen Sie diesen Code (Swift 4.2)

extension URL {
    var attributes: [FileAttributeKey : Any]? {
        do {
            return try FileManager.default.attributesOfItem(atPath: path)
        } catch let error as NSError {
            print("FileAttribute error: \(error)")
        }
        return nil
    }

    var fileSize: UInt64 {
        return attributes?[.size] as? UInt64 ?? UInt64(0)
    }

    var fileSizeString: String {
        return ByteCountFormatter.string(fromByteCount: Int64(fileSize), countStyle: .file)
    }

    var creationDate: Date? {
        return attributes?[.creationDate] as? Date
    }
}

Und benutze ein Beispiel

guard let aStrUrl = Bundle.main.path(forResource: "example_image", ofType: "jpg") else { return }

        let aUrl = URL(fileURLWithPath: aStrUrl)

        print("Img size = \((Double(aUrl.fileSize) / 1000.00).rounded()) KB")
0
let data = UIImageJPEGRepresentation(image, 1)
let imageSize = data?.count

Duplikat von Wie bekomme ich die Größe eines UIImage in KB?

0
efremidze
let imageData = UIImageJPEGRepresentation(image, 1)
let imageSize = imageData?.count

UIImageJPEGRepresentation - gibt das Datenobjekt für das angegebene Bild im JPEG-Format zurück. Der Wert 1,0 steht für die geringste Komprimierung (nahe dem Originalbild).

imageData? .count - gibt die Datenlänge zurück (Zeichenzahl entspricht Bytes).

Wichtig! UIImageJPEGRepresentation oder UIImagePNGRepresentation gibt das Originalbild nicht zurück. Wenn Sie jedoch die angegebenen Daten als Quelle zum Hochladen verwenden, muss die Dateigröße dieselbe sein wie auf dem Server (auch mit Komprimierung).

0

// Schnell 4

if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        ///check image Size
       let imgData = NSData(data: UIImageJPEGRepresentation((pickedImage), 1)!)
       let imageSize: Int = imgData.count
       print("size of image in KB: %f ", Double(imageSize) / 1024.0)
       print("size of image in MB: %f ", Double(imageSize) / 1024.0 / 1024)    

    }
0
Kundan

Swift 4.2

let jpegData = image.jpegData(compressionQuality: 1.0)
let jpegSize: Int = jpegData?.count ?? 0
print("size of jpeg image in KB: %f ", Double(jpegSize) / 1024.0)
0
PinkeshGjr

Einzelheiten

  • Xcode 10.2.1 (10E1001), Swift 5

Lösung

extension String {
    func getNumbers() -> [NSNumber] {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        let charset = CharacterSet.init(charactersIn: " ,.")
        return matches(for: "[+-]?([0-9]+([., ][0-9]*)*|[.][0-9]+)").compactMap { string in
            return formatter.number(from: string.trimmingCharacters(in: charset))
        }
    }

    // https://stackoverflow.com/a/54900097/4488252
    func matches(for regex: String) -> [String] {
        guard let regex = try? NSRegularExpression(pattern: regex, options: [.caseInsensitive]) else { return [] }
        let matches  = regex.matches(in: self, options: [], range: NSMakeRange(0, self.count))
        return matches.compactMap { match in
            guard let range = Range(match.range, in: self) else { return nil }
            return String(self[range])
        }
    }
}

extension UIImage {
    func getFileSizeInfo(allowedUnits: ByteCountFormatter.Units = .useMB,
                         countStyle: ByteCountFormatter.CountStyle = .file) -> String? {
        // https://developer.Apple.com/documentation/foundation/bytecountformatter
        let formatter = ByteCountFormatter()
        formatter.allowedUnits = allowedUnits
        formatter.countStyle = countStyle
        return getSizeInfo(formatter: formatter)
    }

    func getFileSize(allowedUnits: ByteCountFormatter.Units = .useMB,
                     countStyle: ByteCountFormatter.CountStyle = .memory) -> Double? {
        guard let num = getFileSizeInfo(allowedUnits: allowedUnits, countStyle: countStyle)?.getNumbers().first else { return nil }
        return Double(truncating: num)
    }

    func getSizeInfo(formatter: ByteCountFormatter, compressionQuality: CGFloat = 1.0) -> String? {
        guard let imageData = jpegData(compressionQuality: compressionQuality) else { return nil }
        return formatter.string(fromByteCount: Int64(imageData.count))
    }
}

Verwendungszweck

guard let image = UIImage(named: "img") else { return }
if let imageSizeInfo = image.getFileSizeInfo() {
    print("\(imageSizeInfo), \(type(of: imageSizeInfo))") // 51.9 MB, String
}

if let imageSizeInfo = image.getFileSizeInfo(allowedUnits: .useBytes, countStyle: .file) {
    print("\(imageSizeInfo), \(type(of: imageSizeInfo))") // 54,411,697 bytes, String
}

if let imageSizeInfo = image.getFileSizeInfo(allowedUnits: .useKB, countStyle: .decimal) {
    print("\(imageSizeInfo), \(type(of: imageSizeInfo))") // 54,412 KB, String
}

if let size = image.getFileSize() {
    print("\(size), \(type(of: size))") // 51.9, Double
}
0