可以缩小 UIImage 的大小吗?
Posted
技术标签:
【中文标题】可以缩小 UIImage 的大小吗?【英文标题】:Is it ok to scale down UIImage's? 【发布时间】:2015-05-06 21:25:02 【问题描述】:我被告知不要缩小图像,而是始终以原始分辨率使用它们。
我有一个自定义 UITableViewCell,它在单元格上有一个“响应操作”。 Storyboard 中的 UIImageView 是 16x16。
现在我最初使用的是 256x256 的图像,而我的 UIImageView 具有纵横比约束和 16 的高度约束。
然后有人建议我不要缩小图像,而是使用适合我需要的确切尺寸的图像。因此,为我设计了 16x16,我使用了它。但它看起来非常模糊。
结果在这里(旁边的字体是 11.0 点,让您了解它的大小):
解决这个问题的正确方法是什么?你不应该缩小图像吗?是什么原因?它看起来比 16x16 好得多。
【问题讨论】:
【参考方案1】:在将图像添加到项目之前先缩小图像...
获取 256x256 png 图像并将其缩放为 1x、2x 和 3x 大小。 1x 应该等于您需要图像在视图中显示的大小。 2x 和 3x 将支持 Retina 和 Retina HD 显示器。
例如:
名称:image.png |尺寸:16x16
名称:image@2x.png |尺寸:32x32
名称:image@3x.png |尺寸:48x48
将这些图片放入您的Images.xcassets
见:Specifying High-Resolution Images in ios
还有:Icon and Image Sizes
【讨论】:
【参考方案2】:您不需要需要缩小图像,但这是个好主意。如果您将 256x256 塞进 16x16 意味着用户正在下载 65kb 与
但这取决于您使用的屏幕分辨率。即使是 iPhone 4 也使用 Retina,这意味着您的 16x16 图像视图应该包含 32x32 图像。您还应该为 iPhone 6+ 屏幕提供 48x48。这将使您的图像在各种屏幕尺寸上看起来都很棒。
使用Images.xcassets
管理您的图像。
【讨论】:
【参考方案3】:理想情况下,您不应该缩小图像,但您还需要调整屏幕分辨率。旧设备是 1x,retina 设备是 2x,最新的 iPhone 6 设备使用 3x 图像,这意味着每个设备应该使用 16x16、32x32 和 48x48 图像(最好在图像资产中管理)。你现在看到的是一张 1 倍的图像被放大到 2 倍或 3 倍,所以它很模糊。以前你有一个按比例缩小的大图像,这对内存使用不利,但看起来很清晰。
【讨论】:
【参考方案4】:如果您使用的是资产目录中的图像,在开发过程中提供给您自己。您不想在运行时缩小图像,因为它会给您的应用程序增加不必要的开销。而是将资产调整到所需的尺寸,并将它们添加到您的 xcimage 目录中以进行 1x、2x 和 3x 显示。考虑内存和包大小方面的优化,使其工作和看起来不错所需的最小大小是多少?如果您的图像以 20x20 的正方形显示,则最佳尺寸将始终为 20x20、40x40 和 60x60,以显示 1x、2x 和 3x。
现在从网络获取图像是完全不同的游戏。您会发现有时您可能想要缩小图像,但只有当您获取的图像大于您需要显示的图像时,例如当您尝试将 2000x2000 像素的图像放入一个 36x26 像素的正方形。您想要缩小规模有以下三个原因:
它将减少虚拟内存的使用。 如果您保留图像,它将减少存储内存。 您可以避免系统尝试在运行时渲染图像时出现的图像下采样伪影。最好的办法是在您从网络下载后立即缩小图像,然后再在应用中的任何位置使用它。
希望这会有所帮助!
【讨论】:
【参考方案5】:对此有一个纯粹的答案,然后是让您免于整天转换图像的答案。
以下是关于缩放主题的讨论。
iOS - Different images based on device OR scaling the same image?
如果您想避免创建太多图像,那么使用分辨率为 x2 的 x2 图像,预期的点大小使用是一个合理的折衷方案,因为它涵盖了大多数当前设备。只有这样,您才能在 iPhone 3s 上按比例缩小,而在 iPhone 6+ 上按比例放大。如果您希望使用大图像,则只需要大 XxY 图像。我会再次为这些选择 x2 分辨率。通常值得拥有 iPhone 和 iPad 版本的图像,以防您希望在 iPad 上使用更大的 XxY 点大小。
如链接中所述,缩放的影响取决于图像。我只会担心您认为缩放后看起来很糟糕的图像。到目前为止,我还没有发现缩放是一个问题,并且比创建大量定制的 PNG 容易得多。
【讨论】:
【参考方案6】:在设置之前缩小它:
Swift 扩展:
extension UIImage
// returns a scaled version of the image
func imageScaledToSize(size : CGSize, isOpaque : Bool) -> UIImage
// begin a context of the desired size
UIGraphicsBeginImageContextWithOptions(size, isOpaque, 0.0)
// draw image in the rect with zero origin and size of the context
let imageRect = CGRect(origin: CGPointZero, size: size)
self.drawInRect(imageRect)
// get the scaled image, close the context and return the image
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage
例子:
aUIImageView.image = aUIImage.imageScaledToSize(aUIImageView.bounds.size, isOpaque : false)
如果图像没有 alpha,则将 isOpaque 设置为 true:绘图会有更好的性能。
【讨论】:
以上是关于可以缩小 UIImage 的大小吗?的主要内容,如果未能解决你的问题,请参考以下文章