UIImageView размывает изображение - PullRequest
5 голосов
/ 09 августа 2009

У меня действительно странная проблема с UIImageView. У меня есть изображение (RGB PNG) 45x45 пикселей, которые я добавляю к виду. Я вижу, что изображение размыто после добавления в вид. Вот то же изображение в симуляторе (слева) и в Xcode (справа):

alt text
(источник: partywithvika.com )

alt text
(источник: partywithvika.com )

У меня есть пользовательский класс UIImageView с этим кодом initWithImage:

- (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];

Почему отображаемое изображение должно быть таким, которое хранится в файле?

Ответы [ 7 ]

8 голосов
/ 22 марта 2010

В общем, все, что вы делаете на iPhone с UIKit, должно быть выровнено по пикселям. Проблемы с выравниванием пикселей обычно проявляются как размытость (это особенно верно для текста и изображений). Вот почему, когда я нахожу размытое изображение, я сначала проверяю, задаю ли я свойство center. Когда вы устанавливаете center, x, y, высота и ширина кадра корректируются вокруг этой центральной точки ... часто получая дробные значения.

Вы можете попробовать использовать CGRectIntegral на кадре, как показано:

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

Это может работать, но если это не так, попробуйте установить frame вручную, не используя свойство center, чтобы убедиться, что никакие значения не являются дробными.

Редактировать: Упс! Не заметил, что ОП ответил на его собственный вопрос ... Я все равно оставлю это для информационных целей.

3 голосов
/ 12 апреля 2010

Ваш 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);
3 голосов
/ 13 марта 2010

У меня была эта проблема, и это сводило меня с ума. После некоторых исследований выяснилось, что мое изображение было меньше, чем рамка, и, следовательно, масштабирование размыло его. Как только я поместил изображения с более высоким разрешением, проблема исчезла.

Убедитесь, что размер изображения превышает размер кадра UIImageView.

1 голос
/ 31 октября 2011

У меня просто была такая же проблема. Сначала я подумал, нужны ли мне очки?

Тогда я понял, что просто невозможно центрировать изображение (или метку), когда вы даете ему нечетное число. Вы должны изменить размер вашего изображения, например. 46 * 46, если вы хотите отцентрировать его и оставаться острым.

Или вы можете оставить его на 45 * 45, но затем вам нужно решить, хотите ли вы, чтобы ваше изображение было смещено на 1 пиксель вправо или 1 пиксель влево. (или оставьте это расплывчатым).

1 голос
/ 10 августа 2009

В итоге я загрузил большую картинку в 45x45 UIImageView, конечно, с

contentMode = UIViewContentModeScaleAspectFit;
0 голосов
/ 13 января 2012

полный источник для проблемы смещения:

  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)];
0 голосов
/ 09 августа 2009

Попробуйте выровнять ваш IconObj вид по пикселям экрана. Если это действительно 45x45, то вы должны установить центр в что-то вроде CGPointMake (x + 0,5f, y + 0,5f).

Вы также должны дважды проверить размер изображения в пикселях (например, в Preview.app Command-I).

...