缩小UIImage是否可以?

时间:2015-05-06 21:25:02

标签: ios cocoa-touch uiimage

我被告知不要缩小图像,但始终以原始分辨率使用它们。

我有一个自定义的UITableViewCell,它在单元格上有一个'响应动作'。故事板中的UIImageView是16x16。

现在最初我使用的是256x256图像,而我的UIImageView有一个纵横比约束,高度约束为16.

然后有人建议我不要缩小图像,而是要使用符合我所需尺寸的图像。所以16x16是专为我设计的,我用过它。它看起来非常模糊。

结果在这里(它旁边的字体是11.0点,让你知道它的大小):

enter image description here

正确的方法是什么?你不应该缩小图像吗?是什么原因?它看起来比16x16好多了。

6 个答案:

答案 0 :(得分:1)

在将图像添加到项目之前缩小图像...

拍摄256x256 png图像并将其缩放为1x,2x和3x尺寸。 1x应该等于图像在视图中显示所需的大小。 2x和3x将支持视网膜和视网膜高清显示器。

前:

姓名:image.png |大小:16x16

姓名:image@2x.png |大小:32x32

姓名:image@3x.png |大小:48x48

将这些图片放入Images.xcassets

请参阅:Specifying High-Resolution Images in iOS

还:Icon and Image Sizes

答案 1 :(得分:0)

您不需要缩小图片,但这是一个好主意。如果您在16x16中填充256x256意味着用户正在下载65kb vs <1kb的数据。或者,如果它在您的捆绑包中,那么您的应用程序就会变得那么重。&#39>。

但这取决于您使用的屏幕分辨率。即使iPhone 4使用视网膜,这意味着您的16x16图像视图应包含32x32图像。您还应该为iPhone 6+屏幕提供48x48。这将使您的图像在每个屏幕尺寸上看起来都很棒。

使用Images.xcassets管理您的图片。

答案 2 :(得分:0)

您不应该理想地缩小图像,但是您还需要使屏幕分辨率更加舒适。旧设备是1x,视网膜设备是2x,他最新的iPhone 6设备使用3x图像,这意味着每个设备应该使用16x16,32x32和48x48图像(最好在图像资产中管理)。你现在看到的是1x图像被放大到2倍或3倍,所以它很模糊。以前你有一个缩小的大图像,这对于内存使用有害,但看起来很清晰。

答案 3 :(得分:0)

如果您使用资产目录中的图像,则在开发过程中提供给您自己。您不希望在运行时缩小图像,因为它会给您的应用增加不必要的开销。而是将资产调整为所需尺寸,并将它们添加到xcimage目录中,用于1x,2x和3x显示。在内存和包大小方面考虑优化,使其工作和看起来很好所需的最小尺寸是多少?如果您的图像以20x20的方格显示,则最佳尺寸将始终为20x20,40x40和60x60,显示1x,2x和3x。

现在从网络中提取图像是一个完全不同的球赛。你会发现,有时你可能想要缩小图像,但只有当你获取的图像大于你需要显示的图像时,例如当你试图适应2000x2000px时36x26像素的图像。您希望缩小规模有三个原因:

  • 它将减少虚拟内存使用量。
  • 如果您保留图像,它将减少存储空间。
  • 您将从系统尝试在运行时渲染图像时出现的图像下采样工件中保存自己。

这里最好的办法是,一旦您从网络下载并在应用程序中的任何位置使用它之前,请立即缩小图像。

希望这有帮助!

答案 4 :(得分:0)

对此有一个纯粹的答案,然后答案可以帮助您免除整天转换图片的生活。

以下是关于缩放主题的讨论。

iOS - Different images based on device OR scaling the same image?

如果您想避免创建太多图像,那么使用分辨率为x2的x2图像,预期的点大小使用是合理的折衷,因为它涵盖了大多数当前设备。你只会缩小iPhone 3s以及iPhone 6+。如果您希望使用大图像,则只需要大的XxY图像。我再次为那些人寻求x2分辨率。通常值得拥有iPhone和iPad版本的图像,以防iPad上的预期使用情况是使用更大的XxY磅值。

如链接所述,缩放的影响取决于图像。我只会担心缩放时你认为看起来很糟糕的图像。到目前为止,我还没有发现缩放是一个问题,而且比创建大量定制的PNG更容易。

答案 5 :(得分:0)

在设置之前缩小它:

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:绘图将具有更好的性能。