Уменьшить размер файла PNG изображения - PullRequest
0 голосов
/ 14 декабря 2018

Как я могу уменьшить размер файла PNG изображения до менее чем 64 КБ и без потери прозрачного фона и сохранить 512 X 512 пикселей в Swift.

Я пробовал этот код:

   func resizeImageOriginalSize(targetSize: CGSize) -> UIImage {
    var actualHeight: Float = Float(self.size.height)
    var actualWidth: Float = Float(self.size.width)
    let maxHeight: Float = Float(targetSize.height)
    let maxWidth: Float = Float(targetSize.width)
    var imgRatio: Float = actualWidth / actualHeight
    let maxRatio: Float = maxWidth / maxHeight
    var compressionQuality: Float = 0.5
    //50 percent compression

    if actualHeight > maxHeight || actualWidth > maxWidth {
        if imgRatio < maxRatio {
            //adjust width according to maxHeight
            imgRatio = maxHeight / actualHeight
            actualWidth = imgRatio * actualWidth
            actualHeight = maxHeight
        }
        else if imgRatio > maxRatio {
            //adjust height according to maxWidth
            imgRatio = maxWidth / actualWidth
            actualHeight = imgRatio * actualHeight
            actualWidth = maxWidth
        }
        else {
            actualHeight = maxHeight
            actualWidth = maxWidth
            compressionQuality = 0.4
        }
    }
    let rect = CGRect(x: 0.0, y: 0.0, width: CGFloat(actualWidth), height: CGFloat(actualHeight))
    UIGraphicsBeginImageContextWithOptions(rect.size, false, CGFloat(compressionQuality))
    self.draw(in: rect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()



    UIGraphicsEndImageContext()
    return newImage!
}

но размер не тот, который я ожидал.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Я сжимаю в формат WebP, который обеспечивает примерно в 3 раза меньший размер файла по сравнению с PNG, поскольку я собираюсь создать стикер WhatsApp, который также принимает WebP

0 голосов
/ 14 декабря 2018

Вы должны проверить WWDC Session 219 - Лучшие практики для изображений и графики .Первая треть содержит полезную информацию о том, как оптимизировать графику, особенно объем памяти.

Одним из предложенных способов является метод понижающей дискретизации.Вот фрагмент кода:

func downsample(imageAt imageURL: URL, to pointSize: CGSize, scale: CGFloat) -> UIImage {
    let imageSourceOptions = [kCGImageSourceShouldCache: false] as CFDictionary
    let imageSource = CGImageSourceCreateWithURL(imageURL as CFURL, imageSourceOptions)!
    let maxDimensionInPixels = max(pointSize.width, pointSize.height) * scale
    let downsampleOptions =
            [kCGImageSourceCreateThumbnailFromImageAlways: true,
            kCGImageSourceShouldCacheImmediately: true,
            kCGImageSourceCreateThumbnailWithTransform: true,
            kCGImageSourceThumbnailMaxPixelSize: maxDimensionInPixels] as CFDictionary
    let downsampledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, downsampleOptions)!
    return UIImage(cgImage: downsampledImage)
}

При пониженной выборке размер памяти изображения будет уменьшаться пропорционально изменению уменьшенного размера.Кроме того, всегда существует компромисс между качеством изображения и объемом памяти, и результат сильно зависит от алгоритма сжатия и настроек сжатия.

Этот поток переполнения стека , и особенно этот ответ предоставляет несколько советов.

Надеюсь, это поможет.

...