Как уменьшить размер png, сохраненный с помощью swift на iPhone? - PullRequest
0 голосов
/ 29 апреля 2019

В моем приложении пользователь может получить фотографию из галереи, отредактировать ее и затем сохранить в каталоге документов.

Требования к изображению: Размер: 512X512 Размер: меньше, когда 100Kb

Изображения в основном являются стикерами WhatsApp

Мои файлы 250 Кб + Я уже много пробовал, даже пытался сохранить файлы в формате png8 так:

func normalize() -> UIImage {
        let size = CGSize(width: 512, height: 512)
        let genericColorSpace = CGColorSpaceCreateDeviceRGB()
        let context = CGContext(data: nil, width: 512, height: 512, bitsPerComponent: 8, bytesPerRow: 4 * 512, space: genericColorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)
        context?.interpolationQuality = .default//(thumbBitmapCtxt!, CGInterpolationQuality.default)
        let destRect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        context?.draw(self.cgImage!, in: destRect)
        let tmpThumbImage = context?.makeImage()
        let result = UIImage(cgImage: tmpThumbImage!) //, scale: 1, orientation: .up)

        return result
    }

этот метод заставляет изображения выглядеть плохо, но размер даже увеличивается до 300Kb

Если кто-нибудь знает, как с этим бороться, пожалуйста, помогите мне. Обратите внимание, мне не нужен JPEG, мне нужен PNG с прозрачным фоном

Кроме того, это может быть полезно. В моем приложении у меня есть несколько инструментов редактирования, таких как лассо и ластик. Все они сделаны с UIGraphicsImageContext так:

func erase(fromPoint: CGPoint, toPoint: CGPoint) {
        UIGraphicsBeginImageContextWithOptions(lassoImageView.bounds.size, false, 1)
        let context = UIGraphicsGetCurrentContext()
        lassoImageView.layer.render(in: context!)

        context?.move(to: fromPoint)
        context?.addLine(to: toPoint)
        context?.setLineCap(.round)
        context?.setLineWidth(CGFloat(eraserBrushWidth))
        context?.setBlendMode(.clear)
        context?.strokePath()

        lassoImageView.image = UIGraphicsGetImageFromCurrentImageContext()
        croppedImage = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()
    }

Может, что-то не так с моей реализацией UIGraphicsBeginImageContextWithOptions?

Спасибо за любую помощь

...