потеря качества изображения при конвертации базы 64 - PullRequest
0 голосов
/ 30 мая 2019

Please Check i have atteche

У меня есть один PDF, и я преобразую PDF в изображение и отображаю в UIImageView, а затем после того, как я конвертирую это изображение в Base 64, но при конвертации Base64 Я теряю качество изображения, поэтому есть ли какой-нибудь способ предотвратить потерю качества при конвертации в базу 64

, скажите, пожалуйста, есть ли какое-то решение для этого

вот мой код для конвертации

let previewImage1 = convertedImageView.getImage()
let btnImg = UIButton()
btnImg.setImage(previewImage1, for: .normal)
let btn1Imggg2 = btnImg.image(for: .normal)
let imageData2 = btnImg?.jpegData(compressionQuality: 0.0)
let imgString2 = imageData2!.base64EncodedString(options: .init(rawValue: 0))

Даже если я установил качество сжатия на 0,0, его сжатое изображение все равно

У меня есть UIView Внутри у меня есть ScrollView, внутри у меня есть ImageView, и я преобразую всеUIView в качестве изображения, а затем преобразование в base64. Сценарий, который поможет вам понять,

Код для UIView К UIImage

 func getImage(scale: CGFloat? = nil) -> UIImage {
        let newScale = scale ?? UIScreen.main.scale
        self.scale(by: newScale)

        let format = UIGraphicsImageRendererFormat()
        format.scale = newScale

        let renderer = UIGraphicsImageRenderer(size: self.bounds.size, format: format)

        let image = renderer.image { rendererContext in
            self.layer.render(in: rendererContext.cgContext)
        }

        return image
    }

Ответы [ 2 ]

4 голосов
/ 30 мая 2019

Делая это

   let imageData2 = btnImg?.jpegData(compressionQuality: 0.0)

, вы сжимаете изображение с максимально возможным значением.Измените этот код на

   let imageData2 = btnImg?.jpegData(compressionQuality: 1.0)

, и все будет хорошо.

Поскольку вы конвертируете UIView в UIImage, ниже может быть полезна функция:

func image(with view: UIView) -> UIImage? {
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
    defer { UIGraphicsEndImageContext() }
    if let context = UIGraphicsGetCurrentContext() {
        view.layer.render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        return image
    }
    return nil
}

Если данные в формате jpeg не удовлетворяют вашим требованиям, пользователь pngData, подобный этому

let imageData2 = btnImg?.pngData()

После получения преобразования в Image примените преобразование base64, как вы делаете прямо сейчас.

2 голосов
/ 30 мая 2019

Хорошо, поскольку у вас есть вложенная иерархия (UIView -> UIScrollView -> UIImageView), и вы не хотите захватывать всю эту иерархию как изображение, было бы лучше сделать изображение из UIView (самой верхней части в иерархии, если я не понял неправильно, и вы не хотите только часть UIImageView)

let parentMostView = (the view you want to create into an image)

UIGraphicsBeginImageContextWithOptions(size: parentMostView.frame.size, NO, UIScreen.main.scale)

let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGrapgicsEndImageContext()
let imageAsData = image.pngData()
//do your base64 conversion here

РЕДАКТИРОВАНИЕ: После просмотра кода создания вашего изображения

Я не вижу никаких проблем в вашем getImage(:)метод.На каком устройстве вы тестируете (устройства меньшего масштаба создают изображения с низким разрешением, потому что вы зависите от масштаба устройства)?Попробуйте использовать высокое значение статической шкалы (например, 10) и замените Преобразование данных на .jpegData(compressionQuality: 1.0) или .pngData()

.
...