【问题标题】:Retina display for an image from URL来自 URL 的图像的视网膜显示
【发布时间】:2012-07-14 13:21:08
【问题描述】:

我有一些图片需要从网络上获取。仅使用来自 URL 的数据。
它们需要在 Retina 显示屏上正确显示。
当我从网络上获取图像时,它们看起来仍然像素化。我需要将图像的比例设置为视网膜显示(2.0),但我必须遗漏一些东西。 这是我到目前为止所做的。

UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:@"http://www.msdomains.com/tmp/test.png"];

CGRect labelFrame = CGRectMake(0,0,64,64);
UIImageView *imageView = [[UIImageView alloc] initWithFrame:labelFrame];
imageView.contentScaleFactor = [UIScreen mainScreen].scale;

[imageView setImage:img];
[self addSubview:imageView];
[imageView release];

【问题讨论】:

    标签: objective-c ios xcode image retina-display


    【解决方案1】:

    尝试在您的网址末尾添加#@2x.png。这不会更改 URL,但图像将被识别为视网膜 @2x 图像。它对我有用,但我将这种方法用于SDWebImage

    例如使用http://www.msdomains.com/tmp/test.png#@2x.png

    【讨论】:

    • 它确实有效,因为 SDWebImage 在 URL 字符串中查找 "@2x."、""@3x.",如果它存在于任何地方,它将认为图像按指定的比例缩放。用“#”前缀“@2x.”、“@3x.”使其成为 HTML 锚点,您的网络服务器将忽略它。
    【解决方案2】:

    您的代码应该可以正常工作。我不知道您图像的原始尺寸是多少,但我猜它们是 64x64 像素。为了正确缩小,原始图像需要为 128x128 像素。

    作为测试,以下代码在模拟器和我的 iPhone 4 上以 Retina 分辨率正确显示了我的照片:

    UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.seenobjects.org/images/mediumlarge/2006-08-19-native-lilac.jpg"]]];
    
    CGRect labelFrame = CGRectMake(0, 0, 375, 249.5);
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:labelFrame];
    
    [imageView setImage:img];
    [self.view addSubview:imageView];
    

    请注意,UIImageView 是 375x249.5 磅,是照片原始(像素)尺寸的一半。另外,设置contentScaleFactor 似乎没有必要。

    (顺便说一句,我看不出在 URL 上指定 @2x 会有所帮助,在这种情况下,因为对 dataWithContentsOfURL: 的调用将返回一个不透明的数据块,没有留下文件名的痕迹. 就是那些不透明的数据,然后传递给imageWithData: 以加载图像。)

    【讨论】:

      【解决方案3】:

      当你直接将图片URL分配给imageView时,它不会把它当成retina。

      imageView.imageURL = [NSURL URLWithString:@"http://example.com/image.png"];
      

      不会给你视网膜图像。

      因此,尽管您的图像是 200x200,但如果您的 imageView 是 100x100,那么它将从下载的图像中提取 100x100 并在视网膜设备上显示像素化图像。

      解决方案是使用 imageView 的 image 属性而不是 imageURL。

      imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://example.com/image.png"]]];
      

      这会将 200x200 的图像分配给 100x100 的 imageView,因此图像不会被像素化。

      【讨论】:

        【解决方案4】:

        对于视网膜显示,添加相同的图像,其分辨率恰好是原始图像的两倍。不要忘记在此图像名称的末尾添加“@2x”...例如"image_header.png" 是 320x100 的图像,然后操作系统会自动选择另一个名称为 "image_header@2x.png"(尺寸 640x200)的图像用于视网膜显示... 希望对你有帮助

        【讨论】:

        • 你错过了这里的重点:你的建议对于从主包加载的图像是正确的,就是这样。
        猜你喜欢
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        • 2012-06-13
        相关资源
        最近更新 更多