искажение изображения iPhone - PullRequest
1 голос
/ 24 января 2009

Есть ли причины, по которым симулятор будет правильно отображать UIImageViews, но неправильно на iPhone?

Мой процесс: Изображение в файле PNG Запустите UIGraphicsBeginImageContext () Нарисуйте PNG в CGrect Нарисуйте текст в CGRect Создать UIImage из контекста Установите изображение UIImaveView в UIImage Установите рамку UIImageView в размер PNG Добавить в качестве подпредставления

Результат: Изображение не отображается правильно. Самые правые 1-3 пикселя изображения - это просто вертикальная белая линия. Это происходит только на устройстве, а не на симуляторе. Я могу решить эту проблему, но только увеличив размер UIImageView. Если я увеличу size.height UIImageView на 1 пиксель, он отобразит UIImage правильно. Конечно, это заставляет iPhone масштабировать мое изображение, прежде чем рисовать его на экране, что нежелательно.

Есть идеи, почему это происходит, или какие-то исправления? (Я опубликую свой код, если необходимо)

Ответы [ 4 ]

2 голосов
/ 27 января 2009

Вот код, чтобы взять мой файл PNG, нарисовать его с текстом и сохранить как UIImage. Это изображение затем устанавливается в свойство изображения UIImageView, чей кадр является размером изображения (25x25).

-(UIImage *) elementImageWithFrame: (CGRect) aFrame image: (NSString *) anImage{


        int smallFontSize=FONT_SMALL;
        int largeFontSize=FONT_LARGE;

        CGSize mySize = aFrame.size;

        UIGraphicsBeginImageContext(mySize);

        UIImage *backgroundImage = [UIImage imageNamed:anImage];
        CGRect elementSymbolRectangle = CGRectMake(0.0f ,0.0f, aFrame.size.width, aFrame.size.height);
        [backgroundImage drawInRect:elementSymbolRectangle];

        // draw the element name
        [[UIColor whiteColor] set];

        // draw the element number
        UIFont *font = [UIFont boldSystemFontOfSize:(smallFontSize)];
        CGPoint point = CGPointMake(2,1);
        [self.atomicNumber drawAtPoint:point withFont:font];

        // draw the element symbol

        font = [UIFont boldSystemFontOfSize:largeFontSize];
        CGSize stringSize = [self.symbol sizeWithFont:font];
        point = CGPointMake((elementSymbolRectangle.size.width-stringSize.width)/2,aFrame.size.height-(largeFontSize)-(largeFontSize/10));
        [self.symbol drawAtPoint:point withFont:font];

        //get image


        UIImage *theImage=UIGraphicsGetImageFromCurrentImageContext();

            UIGraphicsEndImageContext();

            return (theImage);
    }
1 голос
/ 28 января 2009

Получил ЭТО!

Вот как я победил SDK.

По какой-то причине UIImageView не нравится изображение, созданное UIGraphicsBeginImageContext. Поэтому вместо этого я изменил свой класс как подкласс стандартного UIView (не UIImageView). Затем я реализовал метод drawRect. Внутри метода drawRect я поместил тот же код, что и в блок UIGraphicsBeginImageContext.

По какой-то причине этот код правильно отображает изображение в методе drawRect, но не в UIGraphicsBeginImageContext (может быть, это ошибка, может быть я)

Код следует.

- (void)drawRect:(CGRect)rect {


    UIImage *backgroundImage = [UIImage imageNamed:imageFile];
    CGRect elementSymbolRectangle = CGRectMake(0.0f ,0.0f, backgroundImage.size.width, backgroundImage.size.height);
    [backgroundImage drawInRect:elementSymbolRectangle];

    // draw the element name
    [[UIColor whiteColor] set];

    // draw the element number
    UIFont *font = [UIFont boldSystemFontOfSize:(smallFontSize)];
    CGPoint point = CGPointMake(2,1);
    [self.atomicNumber drawAtPoint:point withFont:font];

    // draw the element symbol

    font = [UIFont boldSystemFontOfSize:largeFontSize];
    CGSize stringSize = [self.symbol sizeWithFont:font];
    point = CGPointMake((elementSymbolRectangle.size.width-stringSize.width)/2,self.frame.size.height-(largeFontSize)-(largeFontSize/10));
    [self.symbol drawAtPoint:point withFont:font];

}

(Также этот код можно найти в образце кода Apple: theElements)

0 голосов
/ 06 июня 2010

У меня была похожая проблема как с drawInRect, так и с CGContextDrawImage, самые правые 2 пикселя стали белыми или каким-то образом инвертированы. Решением было использование изображений PNG, которые не используют альфа-канал.

0 голосов
/ 24 января 2009

Проверяли ли вы параметры масштабирования / изменения размера для UIImageView?

...