UIImage调整性能和质量问题

时间:2013-06-21 07:32:54

标签: ios resize uiimage

我正在使用UIImage和其他所有人一样处理视网膜和非视网膜显示器的适应性。据我所知,视网膜显示器需要双像素。

我想知道我是否可以简单地使用具有相同宽高比的大图像,只需将其调整为较小以适应所有设备?

例如,我制作了尺寸为200 * 200像素的原始图像。现在我想在应用中使用它作为20 * 20像素和80 * 80像素(两种情况)。然后我要制作四份,如img2020.png,img2020 @ 2x.png,img8080.png和img8080@2x.png

因此,如果我想在三种不同大小的情况下使用它,我必须存储6份副本。我可以使用UIImage的resize函数来执行此操作吗?我尝试了一下,但无法弄清楚它的质量和性能。

有什么想法吗?非常感谢:)

3 个答案:

答案 0 :(得分:3)

所有原生API都假设您使用image.pngimage@2x.png,因此有时可能很难仅使用一个图像并根据视网膜/非视网膜进行缩放。此外,在非视网膜设备上使用视网膜图形会导致更广泛地使用这些设备的资源,从而导致电池耗尽。当然,如果您有许多图像,那么会降低应用程序的性能。 换句话说,有理由使用双重图像,您应该更好地使用它而不是缩放一个大图像

答案 1 :(得分:1)

您无需制作6份副本。您应该使用大小200*200 pixel。并将contentMode的属性imageview设置为aspectFit。或者您也可以使用以下功能并在运行时更改图像的大小。

-(UIImage *)Resize_Image:(UIImage *)image requiredHeight:(float)requiredheight andWidth:(float)requiredwidth
{ 
    float actualHeight = image.size.height; 
    float actualWidth = image.size.width; 
    if (actualWidth*requiredheight <actualHeight*requiredwidth) 
    {
        actualWidth=requiredheight*(actualWidth/actualHeight);
        actualHeight=requiredheight; 
    } 
    else
    { 
        actualHeight=requiredwidth*(actualWidth/actualHeight);   actualWidth=requiredwidth;
    }
    CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight); 
    UIGraphicsBeginImageContext(rect.size); 
    [image drawInRect:rect]; 
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return img;
}

答案 2 :(得分:0)

之前我做了一些比较。离开iOS处理调整大小会降低质量,有时甚至是不可接受的。

我有时感到懒惰,我的方法是用视网膜版本运行它,如果它看起来很糟糕,我会创建一个低分辨率版本。

如果您正在编写仅限iPhone的应用程序,市场上的大多数iPhone都有视网膜,因此我认为您不应该担心非视网膜版本。只是我的意见。