【问题标题】:Drawing retina versus non-retina images绘制视网膜与非视网膜图像
【发布时间】:2013-04-04 22:39:52
【问题描述】:

UIImage 1:从带有@2x 修饰符的文件加载,大小为 400x400,因此 UIImage 1 将报告其大小为 200x200

UIImage 2:从没有大小为 400x400 的 @2x 修饰符的文件加载,因此 UIImage 2 将报告其大小为 400x400

然后我从上面创建 2 个图像,将下面的代码应用于每个图像

UIGraphicsBeginImageContextWithOptions(CGSizeMake(400,400), YES, 1.0);
[image drawInRect:CGRectMake(0, 0, 400, 400)];
UIImage *rescaledI = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

考虑到上述情况,我可以期望两个生成图像的图像质量完全相同吗? (我正在尝试确定将 200x200 视网膜图像绘制到 400x400 非视网膜上下文是否会降低质量,而不是绘制未加载为视网膜图像的相同图像)

【问题讨论】:

    标签: ios


    【解决方案1】:

    只返回当前图像的大小。

       UIImage *image1 = [UIImage imagedNamed:@"myimage.png"];
        //access width and height like this
        image1.size.width;
        image1.size.height;
    
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(image1.size.width,  image1.size.height), YES, 1.0);
    [image drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];
    UIImage *rescaledI = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    

    当然,如果您应该将 image1 替换为您想要获取大小的任何图像。一些 switch 语句或 if 语句应该可以为您解决问题。

    永远不要硬编码大小/尺寸/位置等。您应该始终通过询问图像的大小来动态提取这些信息。然后,您可以更改图像的大小,而不必担心在您的应用程序中找到硬编码的大小。

    【讨论】:

    • 我的问题与访问宽度和高度无关。它与系统在低级别如何处理具有不同比例因子的 UIImage 的绘制有关。
    【解决方案2】:

    图像始终为 400*400 像素:不同之处在于,在 Retina 显示器中,400*400 像素覆盖的空间更少,正好是一半(200*200 核心图形点)。如果您不对图像应用任何转换,则将保持完全相同。

    您编写的代码按原样呈现图像,因为您覆盖了设备比例因子并将其设置为始终 1(1 像素到 1 点)。 如果您希望图像在 Retina 和非 Retina 设备上覆盖相同数量的屏幕,则应使用两张图像,其中一张大两倍。

    【讨论】:

    • 我写的代码在 Retina 显示器上没有两倍大,因为我将比例设置为 1.0。
    猜你喜欢
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多