减小 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 图像的文件大小的主要内容,如果未能解决你的问题,请参考以下文章