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

为啥从相机缩小 UIImage 这么慢?

使用声音捕捉 Swift 放大/缩小 UIImage

UIImage 调整大小并裁剪以适合

了解 UIImage 大小属性与 UIView 框架大小属性的比较

将 UIImage 大小与 pdf 大小匹配

逐帧调整动画 UIImage 的大小非常慢