【问题标题】:Blurry image when forcing load of x2 version of an image on iPad强制在 iPad 上加载 x2 版本的图像时图像模糊
【发布时间】:2012-01-27 14:39:12
【问题描述】:

我正在尝试手动强制 iOS 加载文件图像文件的 2x 版本。我这样做是为了节省资源 - 我需要 iPhone 版本的图形,并且我想以 1:1 的比例在 iPad 版本中使用它。

为此,我不能使用 initWithContentsOfFile,因为即使我在文件名中添加了 x2,iOS 也会为我提供 x1 版本。相反,我使用以下代码:

NSString *filename = [myImage filenameWithSuffix:@"@2x"];
UIImage *image = [[UIImage alloc] initWithCGImage:[[UIImage imageWithData:[NSData dataWithContentsOfFile:filename]] CGImage]
                                            scale:1.0
                                      orientation:UIImageOrientationUp];

UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

这行得通。我 100% 确定它正在使用 x2 版本(我更改了该图形以确保)。

但是,当它以正确的尺寸显示在屏幕上时,它是模糊的。事实上,看起来 x1 版本被炸毁了 200%,所以 iOS 对我的形象做了一些奇怪的事情。

我已确保在像素边界上绘制图像。

更新:

即使我创建另一个没有 x2 后缀的图像文件并使用 initWithContentsOfFile 加载它,它仍然是模糊的。所以这与它的加载方式无关。

除了像素错位之外,还有什么会导致图像质量下降?

请注意,我已经截取了屏幕截图,并将图像与 Photoshop 中的原始图像进行了比较。它的大小完全相同,因此缩放不是问题。

【问题讨论】:

  • 据我所见,您应该同时拥有正常图像和“@2x”图像,并且操作系统将根据屏幕分辨率放置图像,而无需指定比例。您是否尝试过仅使用普通名称并让操作系统为您获取“@2x”?
  • 原来这与x2方面无关。有关详细信息,请参阅我的更新。

标签: iphone ios ipad uiimage scaling


【解决方案1】:

这只是在黑暗中拍摄,但请尝试将 init 方法中的比例更改为 2。

NSString *filename = [myImage filenameWithSuffix:@"@2x"];
UIImage *image = [[UIImage alloc] initWithCGImage:[[UIImage imageWithData:[NSData dataWithContentsOfFile:filename]] CGImage]
                                            scale:2.0
                                      orientation:UIImageOrientationUp];

UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

我能够使用这个在 iPad 上很好地加载 @2x 图像:

UIImage *image = [UIImage imageNamed:@"fileName@2x"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[imageView sizeToFit];
[self.view addSubview:imageView];

(由于我使用了imageNamed,并且图片是.png,所以我没有在文件名后附加.png,因为它是由方法假定的)

【讨论】:

    【解决方案2】:

    这个问题我已经解决了,不好意思说是像素对齐问题。

    我发现 iOS 模拟器可以突出显示未对齐的图像,这证明了图像确实未对齐。然后我从图像向上记录每个视图的位置,以便找到导致问题的那个。这个 sn-p 多次证明了它的重量:

        NSLog(@"View details");
        UIView *view = theImageView;
        while (view)
        {
            NSLog(@"%@", view);
            view = [view superview];
        }
    

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多