减小 png 图像的文件大小

Posted

技术标签:

【中文标题】减小 png 图像的文件大小【英文标题】:Reduce the file size of png image 【发布时间】:2018-12-14 13:11:18 【问题描述】:

如何在 Swift 中将 png 图像的文件大小减少到小于 64KB 且不丢失透明背景并保持 512 X 512 像素。

我试过这段代码:

   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!

但尺寸不是我所期望的。

【问题讨论】:

你肯定尝试过 something。不要犹豫,展示您的尝试,以免这看起来像是“为我编写代码”的问题! 这主要取决于图像中的颜色数量以及压缩的难易程度。 你试过缩放图片吗? @dev 你的图片文件大小是多少? @dev,如果你告诉更多关于减小大小的目的和限制 64KB 的原因,你将更有可能得到帮助。 【参考方案1】:

您应该检查WWDC Session 219 - Image and graphics best practices。其中前三分之一包含有关如何优化图形的有用信息,尤其是内存占用。

建议的方法之一是下采样技术。这是一个sn-p:

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)

下采样将根据下采样大小的变化成比例地减少图像内存大小。此外,图像质量和内存占用之间总是需要权衡取舍,结果很大程度上取决于压缩算法和压缩设置。

这个*** thread,尤其是this answer 提供了一些提示。

希望对你有帮助。

【讨论】:

如何减少图像中的颜色数量并保持与输入尺寸相同的 512 X 512 像素输出? @dev,大致的想法是:您选择一个像素并用与像素颜色相似的颜色重新绘制周围的像素。最好的情况是,如果人眼看不到差异。在实践中很难做到。对于您的情况,您应该在图像中使用最少的颜色,更重要的是 - 没有渐变或渐变最少。带有少量颜色的类矢量插图肯定适合 512x512 / 100KB,因此对于照片,您必须压缩 png,并且质量不会“清晰”。 c'est la vie【参考方案2】:

我正在压缩为 WebP 格式,与 PNG 相比,它提供的文件大小大约小 3 倍,因为我要创建也接受 WebP 的 WhatsApp 贴纸包

【讨论】:

以上是关于减小 png 图像的文件大小的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PIL 减小图像文件大小

磁盘上的图像文件大小(KB)随着Java中动态图像大小的调整(减小大小)而增加

怎么减小png图片所占空间大小

Android - 减小图像文件大小

如何在本机反应中减小图像文件大小?

优化从相机胶卷中挑选的图像以减小文件大小