【问题标题】:UIImageView blurs imageUIImageView 模糊图像
【发布时间】:2009-08-09 04:56:19
【问题描述】:

我对 UIImageView 有一个非常奇怪的问题。我有一个 45x45 像素的图像(RGB png),我添加到视图中。我可以看到图像在添加到视图后变得模糊。这是模拟器(左)和 Xcode(右)中的相同图像:


(来源:partywithvika.com


(来源:partywithvika.com

我有这个 initWithImage 代码的自定义 UIImageView 类:

- (id) initWithImage:(UIImage*) image {
    self = [super initWithImage:image];

    self.frame = CGRectMake(0, 0, 45, 45);
    self.contentMode = UIViewContentModeScaleAspectFit;

    self.quantity = 1;
    if (self) {
        self.label = [[UITextField alloc]initWithFrame:CGRectMake(0,40,45,25)];
        self.label.font = [UIFont systemFontOfSize:16];
        self.label.borderStyle = UITextBorderStyleNone;
        self.label.enabled = TRUE;
        self.label.userInteractionEnabled = TRUE;
        self.label.delegate = self;
        self.label.keyboardType = UIKeyboardTypeNumbersAndPunctuation;
        self.label.textAlignment = UITextAlignmentCenter;
    }
    self.userInteractionEnabled = TRUE;

    // Prepare 3 buttons: count up, count down, and delete
    self.deleteButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    self.deleteButton.hidden = NO;
    self.deleteButton.userInteractionEnabled = YES;
    self.deleteButton.titleLabel.font  = [UIFont systemFontOfSize:20];
    self.deleteButton.titleLabel.textColor = [UIColor redColor];
    [self.deleteButton setTitle:@"X" forState:UIControlStateNormal];
    [self.deleteButton addTarget:self action:@selector(deleteIcon:) forControlEvents:UIControlEventTouchUpInside];

    self.upCountButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    self.upCountButton.hidden = NO;
    self.upCountButton.userInteractionEnabled = YES;
    [self.upCountButton setTitle:@"+" forState:UIControlStateNormal];
    [self.upCountButton addTarget:self action:@selector(addQuantity:) forControlEvents:UIControlEventTouchUpInside];

    self.downCountButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    self.downCountButton.hidden = YES;
    self.downCountButton.userInteractionEnabled = YES;
    [self.downCountButton setTitle:@"-" forState:UIControlStateNormal];
    [self.downCountButton addTarget:self action:@selector(removeQuantity:) forControlEvents:UIControlEventTouchUpInside];
    return self;
}

我是这样创建的:

UIImage *desertIcon = [UIImage imageNamed:@"desert.png"];
IconObj *desertIconView = [[IconObj alloc] initWithImage:desertIcon];
desertIconView.center = CGPointMake(265,VERTICAL_POINT_ICON);
desertIconView.type = [IconObj TYPE_DESERT];
[self.view addSubview:desertIconView];
[desertIconView release];

为什么显示的图像与存储在文件中的图像不同?

【问题讨论】:

  • 这可能与问题无关,但是如果在分配self = [super initWithImage:image] 后检查 self 是否为 nil,如果是,则立即返回 nil,您的 init 方法会更传统。如果 self 为 nil,则要么是因为 (1) 父级的初始化程序无法正确初始化自身,要么 (2) 由于某些奇怪的内存条件(非常罕见),alloc 返回了 nil。这是一种很好的防御性编程实践。
  • 感谢您的留言,我会试试这个。

标签: objective-c iphone uiimageview blur


【解决方案1】:

一般来说,你在 iPhone 上使用 UIKit 所做的一切都应该是像素对齐的。像素对齐问题通常表现为模糊(尤其是文本和图像更是如此)。这就是为什么当我发现视图模糊时,我首先检查我是否设置了center 属性。当您设置center 时,框架的 x、y、高度和宽度会围绕该中心点进行调整...经常导致小数值。

您可以尝试在框架上使用CGRectIntegral,如图所示:

desertIconView.center = CGPointMake(265,VERTICAL_POINT_ICON);
desertIconView.frame = CGRectIntegral(desertIconView.frame);

这可能有效,但如果无效,请尝试手动设置frame,而不使用center 属性以确保没有值是小数。

编辑:哎呀!没有注意到 OP 已经回答了他自己的问题......无论如何,出于信息原因,我会留下这个。

【讨论】:

  • 大多数其他答案(除了原始海报)都认识到这是一个像素对齐问题,但是 +1 是因为它是最干净和最通用的。解决方案
【解决方案2】:

我遇到了这个问题,这让我发疯了。经过一番调查,结果发现我的图像比框架小,因此放大使其模糊。一旦我放入了更高分辨率的图像,问题就消失了。

确保您的图像尺寸大于您的 UIImageView 框架尺寸。

【讨论】:

    【解决方案3】:

    您的 IconObj 为 45 像素宽。您将 IconObj 中心移动到 265,使其框架变为 (242.5, VERTICAL_POINT_ICON - 25*0.5, 45, 25)。如果某些帧参数不是整数,图像将始终模糊。

    解决方案,自己计算框架参数(不要使用中心)。并且始终将其设为整数(强制转换为 NSInteger,使用 ceil、floor 或 round)。

    desertIconView.frame = CGRectMake((NSInteger)(265 - 45*0.5),
                                      (NSInteger)(VERTICAL_POINT_ICON - 25*0.5),
                                      45, 25);
    

    【讨论】:

      【解决方案4】:

      我最终做的是将更大的图片加载到 45x45 UIImageView 中,当然是使用

      contentMode = UIViewContentModeScaleAspectFit;
      

      【讨论】:

      • 我告诉过你要仔细检查图像大小。
      • Nikolai,我的图像是 45x45,UIImageView 的框架也是 45x45。您认为哪些地方可能会误解此设置?
      • 您是否尝试将图像的像素与屏幕像素对齐?
      • Nikolai 是正确的:您的图像尺寸都是奇数 (45),并且将 center 属性设置为整数点意味着您的原点偏移了半个像素 (0.5)。这将导致每次图像模糊。设置中心时,必须检查每个维度,如果该维度是奇数,则调整 0.5。
      【解决方案5】:

      我也遇到了同样的问题。首先我想我需要眼镜吗?

      然后我意识到当你给它一个奇数时,它不可能居中图像(或标签)。您需要将图像大小调整为例如46*46,如果你想居中并保持锐利。

      或者您可以将其保留为 45*45,但您需要决定您的图像是偏右 1 像素还是偏左 1 像素。 (或让它模糊)。

      【讨论】:

        【解决方案6】:

        尝试将您的IconObj 视图与屏幕像素对齐。如果它真的是 45x45,那么你应该将中心设置为 CGPointMake(x + 0.5f, y + 0.5f)。

        您还应该仔细检查以像素为单位的图像大小(例如在 Preview.app Command-I 中)。

        【讨论】:

        • Nikolai,我没明白你在评论中所说的“x”和“y”是什么意思。有趣的是 UIImageView 如果用相同的代码用更大的图片初始化是非常清晰的。
        • x 和 y 是指任何整数坐标。虽然视图的框架、边界和中心属性对所有坐标都使用基于 CGFloat 的类型,但将视图像素对齐到屏幕通常是个好主意。
        【解决方案7】:

        偏移问题的完整来源:

          contentImage  = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
        
          UIImage *cImage = [UIImage imageNamed:image];
          self.contentImage.image = cImage;
        
          [self.contentImage setFrame:CGRectMake(0, 0, cImage.size.width, cImage.size.height)];
        
          CGFloat offset = 0.0f;
        
          if ( ( (int)cImage.size.width % 2 ) && ( (int)cImage.size.height % 2 ) ) {
            offset = 0.5f;
          }
        
          [self.contentImage setCenter:CGPointMake(256.0f + offset, 256.0f + offset)];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-24
          • 1970-01-01
          • 2017-04-30
          • 2015-06-10
          • 2014-06-13
          • 2015-09-19
          • 2019-02-02
          • 2019-05-13
          相关资源
          最近更新 更多