Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Мобильные ОС (Android, iOS, Windows Phone)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2018, 20:29   #1
ser70
Форумчанин
 
Аватар для ser70
 
Регистрация: 02.10.2009
Сообщений: 255
По умолчанию Сохранить компрессию UIImageJPEGRepresentation

Здравствуйте уважаемые форумчане!
Нашел код компрессии изображения, что приведен ниже.

Код:
func resized(withPercentage percentage: CGFloat) -> UIImage? {
        let canvasSize = CGSize(width: size.width * percentage, height: size.height * percentage)
        UIGraphicsBeginImageContextWithOptions(canvasSize, false, scale)
        defer { UIGraphicsEndImageContext() }
        draw(in: CGRect(origin: .zero, size: canvasSize))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
    
    func resizedTo1MB() -> UIImage? {
        guard let imageData = UIImageJPEGRepresentation(self, 1.0) else {return nil}
        
        var resizingImage = self
        var imageSizeKB = Double((imageData.count)) / 1000.0 // ! Or devide for 1024 if you need KB but not kB
        
        while imageSizeKB > 150 { // ! Or use 1024 if you need KB but not kB
            let resizedImage = resizingImage.resized(withPercentage: 0.9)
            let imageData = UIImageJPEGRepresentation(resizedImage!, 0.5)
            
            resizingImage = resizedImage!
            imageSizeKB = Double((imageData?.count)!) / 1000.0
            print("imageSizeKb = ", imageSizeKB)// ! Or devide for 1024 if you need KB but not kB
            print("resizingImage.width = ", resizingImage.size.width, ", resizingImage.height = ", resizingImage.size.height)
        }
        
        let compressionImageData = UIImageJPEGRepresentation(resizingImage, 0.5)
        return UIImage(data: compressionImageData!)
    }
}
Дело в том, что цикл перестает работать, когда изображение сожмется до 150 кб. В логах отчетливо видно, что цикл прекращается именно в этот момент! Изображение весит <150 кб., ширина: >1000 px, длинна: >1100 px.

Код:
for element in self.imgArray{
                let oldImage = element
                let imageData =  Data(UIImageJPEGRepresentation(oldImage, 1.0)!)
                let newImage = UIImage(data: imageData)
                let resizedImage = newImage?.resizedTo1MB()
                print("resizedImage: do something with image")
                let dataResizedImage = UIImagePNGRepresentation(resizedImage!)
                print("imageData = ", Double((imageData.count)) / 1000.0)
                print("dataResizedImage = ", Double((dataResizedImage?.count)!) / 1000.0)
                newImgArray.append(/*compressImageWhatsApp(image: newImage!)*/resizedImage!)
            }
Но дело в том, что когда я возвращаю изображение, то в исходном коде в верху видно, что при передаче на сервер(переменная dataResizedImage) оно весит больше 1500 кб. Я не могу понять с чем это связанно, если кто знает, как исправить эту ситуацию буду очень благодарен!
"Реальность воображаема, а воображаемое - реально" В. Соло
ser70 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сохранить ответы (сохранить результат игры) и не срабатывает рандом в вопросах geto C++ Builder 0 03.05.2017 18:28
Отключить кнопку СОХРАНИТЬ и СОХРАНИТЬ КАК vit-b Microsoft Office Excel 2 20.06.2013 16:09
Сохранить и сохранить как [ScintillaNET и dockPanel]] garengobit Помощь студентам 0 27.05.2012 15:24
сохранить artemavd Общие вопросы Delphi 3 31.07.2008 19:08