Изменение размера изображения с помощью stretchableImageWithLeftCapWidth - PullRequest
7 голосов
/ 24 апреля 2009

Я пытаюсь изменить размер изображения с помощью stretchableImageWithLeftCapWidth: оно работает на симуляторе, но на устройстве появляются вертикальные зеленые полосы.

Я пытался использовать imageNamed, imageWithContentOfFile и imageWithData, чтобы загрузить изображение, оно не меняется.

UIImage *bottomImage = [[UIImage imageWithData:
     [NSData dataWithContentsOfFile:
    [NSString stringWithFormat:@"%@/bottom_part.png", 
     [[NSBundle mainBundle] resourcePath]]]] 
       stretchableImageWithLeftCapWidth:27 topCapHeight:9];

UIImageView *bottomView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 200+73, 100, 73)];
[self.view addSubview:bottomView];
UIGraphicsBeginImageContext(CGSizeMake(100, 73));
[bottomImage drawInRect:CGRectMake(0, 0, 100, 73)];
UIImage *bottomResizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
bottomView.image = bottomResizedImage;

Посмотрите на результат: зеленых полос не должно быть, они не отображаются на симуляторе.

альтернативный текст http://www.quicksnapper.com/files/5161/96232162149F1C14751048_m.png

Ответы [ 7 ]

12 голосов
/ 02 декабря 2009

Вы поняли это?

Похоже, что это может быть ошибка с UIGraphicsGetImageFromCurrentImageContext. Если я рисую изображение с прозрачностью, я получаю красные / зеленые артефакты. Они появляются только на устройстве (не в симе). Также, если я уберу прозрачность с изображения, артефакты исчезнут.

Обновление: еще немного странностей. Я раньше использовал PNG, поэтому вместо этого я попробовал использовать прозрачный GIF. Используя GIF, показывает проблему артефакта на симе.

Победа! Нашел решение:

Отключите «Сжатие файлов PNG» в настройках сборки для вашего проекта. Отключение этого делает прозрачность PNG без артефактов.

5 голосов
/ 29 апреля 2009

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

Чтобы получить изображение:

[[UIImage imageName: @"bottom_part.png"] stretchableImageWithLeftCapWidth: 27 topCapHeight: 9];

Какую часть вашего кода вы отображаете это изображение? т.е. при каком вызове метода вы рисуете изображения выше?

Почему бы просто не использовать UIImageView и поместить туда изображение? Тогда вам не нужно ничего рисовать в контексте изображения и т. Д.

1 голос
/ 21 апреля 2010

В моем случае у меня был UIImageView, который я растянул горизонтально. Я нашел странную вертикальную белую линию на растянутом изображении.

Приведенные выше решения не сработали для меня. Тем не менее, следующие сделали:

Приведите значение ширины к значению int:

myNewViewFrame.size.width = (int)newWidth;
myView.frame = myNewViewFrame;

Надеюсь, это сработает и у вас, ребята ...

0 голосов
/ 08 сентября 2010

Я обнаружил похожие проблемы с contentStretch (на любом UIView, который рисовал контент) при использовании значения (0.5, 0.5, 0, 0). т. е. растянуть по центру пикселя.

Я обнаружил, что только iphone 3G (возможно, 2G) демонстрирует эту проблему. с iphone 4 и 3GS все в порядке. Итак, я предполагаю, что это проблема со старой графикой HW.

Я нашел способ решить эту проблему - растянуть немного большую центральную область.

например. (0,4, 0,4, 0,1, 0,1)

0 голосов
/ 02 сентября 2010

Я пытался отключить сжатие PNG, как предложил Нейт, но у меня это не сработало (iOS 3.1.3). Затем я попытался использовать изображения TIFF вместо PNG, который работает.

0 голосов
/ 13 августа 2010

Я прекратил использовать stretchableImageWithLeftCapWidth в пользу гораздо более качественного свойства UIView contentStretch. Я никогда не видел зеленых полос, которые вы описываете, но в целом я бы рекомендовал использовать contentStretch вместо stretchableImageWithLeftCapWidth.

0 голосов
/ 15 января 2010

Я потратил 5 часов на отладку этой прошлой ночью, отключение сжатия PNG в xcode ничего не сделало для меня.

Для всех, кто встречает вертикальные, зеленые, столбцы / линии / артефакты с stretchableImageWithLeftCapWidth (в UIImage API) - этот пост для вас.

У меня есть 21x30 для пользовательского фона кнопки, который я хочу расширить, но получил те же зеленые полосы, что и у OP. Я нашел PNG, созданный с помощью Photoshop, и он работал нормально - мои сделаны с помощью Gimp. В любом случае, удаление ВСЕХ кусков из файлов (кроме трех основных) не имеет значения. Также не было отключено сжатие PNG.

Что сработало для меня, так это:

  1. Добавьте ОДНУ пустую строку над моим изображением (теперь это 21x31).
  2. Установить topCapHeight: 0 при создании масштабированного изображения.
  3. Когда я использую свое масштабированное изображение, я рисую в CGContext, который позже используется для создания UIImage. Я использую это, чтобы нарисовать: [изображение drawInRect: CGRectMake (0, -2, ширина, 32)];

Это устраняет проблему (для меня).

Я предполагаю, что ошибка / проблема связана с , а не масштабированием по вертикали при рисовании, поэтому я заставляю масштабировать первую линию исходного изображения (на две линии), которые рисуются вне моей композиции. 1021 *

Надеюсь, это поможет кому-то сэкономить 5 часов.

/ Krisb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...