Потеря качества изображения при конвертации базы 64
У меня есть один PDF, и я преобразовываю PDF в изображение и отображаю в UIImageView
и затем после того, как я конвертирую это изображение в базу 64, но при конвертации базы 64 я теряю качество изображения, поэтому есть ли какой-то способ предотвратить потерю качества при конвертации в базу 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
как изображение, а затем преобразовать в base 64 сценарий надеюсь, что это поможет вам понять
Код для 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 ответа
Делая это
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, как вы делаете сейчас.
Хорошо, поскольку у вас есть вложенная иерархия (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()