Как получить размер изображения в КБ или МБ из средства выбора изображений?

У меня возникла проблема с получением размера изображения в моем коде, вот что я делаю:

let imageData : NSData = UIImageJPEGRepresentation(images[0], 1) as! NSData 
let formatter = ByteCountFormatter() 
formatter.allowedUnits = .useKB 
formatter.countStyle = .binary 
let imageSize = formatter.string(fromByteCount: Int64(imageData.length))
print(imageSize)

person phadte viraj    schedule 17.04.2018    source источник
comment
NSData * imageData = UIImageJPEGRepresentation (_imgBackground.image, 1); int imageSize = imageData.length / 1024.0; попробуй это   -  person Ravi Panchal    schedule 17.04.2018
comment
Что вы имеете в виду под подборщиком изображений? Не могли бы вы рассказать поподробнее?   -  person Emre Önder    schedule 17.04.2018
comment
Я использую UIPickerView, чтобы выбрать изображение из моей галереи, и я устанавливаю его конкретный вид, но на нем есть ограничения памяти   -  person phadte viraj    schedule 17.04.2018
comment
Вы не должны создавать массив изображений. Вы должны создать массив с их URL-адресами. Неудивительно, что у вас проблемы с памятью   -  person Leo Dabus    schedule 17.04.2018
comment
@Ravipanchal, я пробовал, я проверяю размер, который я получаю в моем журнале, с фактическим размером на моем телефоне, но он не совпадает   -  person phadte viraj    schedule 17.04.2018
comment
См. этот ответ   -  person TheTiger    schedule 17.04.2018
comment
.binary будет делать там   -  person phadte viraj    schedule 17.04.2018
comment
@LeoDabus Я согласен, но Apple упомянула это в документе, поэтому я использовал .file.   -  person TheTiger    schedule 17.04.2018
comment
@LeoDabus .memory используется для binaryStyle, а .file для decimalStyle. Разве нам не нужно показывать размер в десятичных дробях, например 1.7 MB?   -  person TheTiger    schedule 17.04.2018
comment
если вы передаете счетчик данных, вы должны использовать .memory, если вы передаете размер файла, вы должны использовать .file   -  person Leo Dabus    schedule 17.04.2018
comment
для использования .file это будет что-то вроде этого if let url = info[UIImagePickerControllerImageURL] as? URL { do { if let fileSize = (try url.resourceValues(forKeys: [.fileSizeKey])).fileSize { print("fileSize", fileSize) let formatter = ByteCountFormatter() formatter.allowedUnits = .useKB formatter.countStyle = .file let imageSizeInKB = formatter.string(for: fileSize) ?? "" print("imageSizeInKB:",imageSizeInKB) } } catch { print(error)}}   -  person Leo Dabus    schedule 17.04.2018
comment
Но когда я тестирую его с .file, он печатает 1.7 MB, а .memory также печатает 1.7 MB. Я поменяю его на .memory, но в каком случае это даст другой результат?   -  person TheTiger    schedule 17.04.2018
comment
@TheTiger Я точно не знаю, при каких обстоятельствах это будет иметь значение. Обратите внимание, что вы также можете получить .totalFileSizeKey, .fileAllocatedSizeKey и .totalFileAllocatedSizeKey, который включает размер файла метаданных.   -  person Leo Dabus    schedule 17.04.2018
comment
@LeoDabus Хорошо, спасибо за комментарии. Меняю его на .memory.   -  person TheTiger    schedule 17.04.2018


Ответы (3)


Здесь Вы можете получить размер изображения

  func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
            var Size = Float()
            var data = Data()
            btnCancel.isUserInteractionEnabled = true

            if let mediaType = info[UIImagePickerControllerMediaType] as? String {

                if mediaType  == "public.image" {
                    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
                        data = UIImageJPEGRepresentation(pickedImage, 1.0)!
                      //Here you get MB size
                        Size = Float(Double(data.count)/1024/1024)

                      //For Kb just remove single 1024 from size 

                      // I am checking 5 MB size here you check as you want
                        if Size <= 5.00{
                            // Here your image
                        }  
                    }
                }
                else
                if mediaType == "public.movie" {
                    let videoURL = info[UIImagePickerControllerMediaURL] as? URL
                    data = try! Data.init(contentsOf: videoURL!)
                    Size = Float(Double(data.count)/1024/1024)
                    if Size <= 5.00{
                        //your video here
                    }
                }
            }
            picker.dismiss(animated: true) {
                if Size > 5.0{
                    Utilities.showAlertView(title: "title", message: "message")
                }
            }
        }

        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
            picker.dismiss(animated: true, completion: nil)
        }
person Jitendra Modi    schedule 17.04.2018
comment
Вам нужно просто получить URL-адрес изображения и проверить размер файла. - person Leo Dabus; 17.04.2018
comment
почему if Size <= 5.00? - person Scriptable; 17.04.2018
comment
Это просто пример - person Jitendra Modi; 17.04.2018
comment
Это не настоящий размер изображения. Изображение может быть даже не в формате jpeg - person Leo Dabus; 17.04.2018
comment
но вы можете получить фактический размер в параметре Size, чтобы вы могли проверить в пределах вашего лимита. Я уже тестировал этот код и работал в моем приложении. - person Jitendra Modi; 17.04.2018
comment
Опять же, вы должны просто получить UIImagePickerControllerImageURL и использовать метод URL resourceValues, чтобы получить размер файла url.resourceValues(forKeys: [.fileSizeKey]).fileSize - person Leo Dabus; 17.04.2018
comment
Зачем загружать весь фильм в память только для того, чтобы проверить его размер? Это безумие - person Leo Dabus; 17.04.2018
comment
Да, это проблема, например, когда изображение большого размера, для преобразования в данные потребуется нагрузка, поэтому я попробую ваше решение, спасибо за это - person Jitendra Modi; 17.04.2018

Вы можете просто проверить размер в КБ с помощью следующего UIImage расширения:

extension UIImage {
    func logImageSizeInKB(scale: CGFloat) -> (Int, Data) {
        let data = UIImageJPEGRepresentation(self, scale)!
        let formatter = ByteCountFormatter()
        formatter.allowedUnits = ByteCountFormatter.Units.useKB
        formatter.countStyle = ByteCountFormatter.CountStyle.file
        let imageSize = formatter.string(fromByteCount: Int64(data.count))
        print("ImageSize(KB): \(imageSize)")

        return (Int(Int64(data.count) / 1024), data)
    }
}

Примечание.

Можно также использовать UIImagePNGRepresentation для размера изображения PNG. Кстати изображения PNG тяжелее, чем JPEG / JPG.

person Ankit Jayaswal    schedule 17.04.2018

Попробуйте этот код, чтобы получить размер изображения при получении изображения из окна выбора.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        dismiss(animated: true, completion: nil);

        let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
        //get the size of image
        let imgData: NSData = NSData(data: UIImageJPEGRepresentation((chosenImage), 1)!)
        let imageSize: Int = imgData.length
        print("size of image in MB: %f ", Double(imageSize) / 1024.0/1024.0)
    }
person AtulParmar    schedule 17.04.2018