jpg изображения в iphone и 2x изображения - PullRequest
22 голосов
/ 06 июля 2011

Я работаю над приложением для iPhone и нацеливаюсь на iOS 4.0 или более позднюю версию.Я пытаюсь добавить изображение в UIImageView, и изображение в формате jpeg .Это то, что я сделал до сих пор ..

UIImageView *bgImageView            =   [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 246.0)];
bgImageView.image                   =   [UIImage imageNamed:@"background"];
[self.view addSubview:bgImageView];
[bgImageView release];

Я добавил два изображения,

  1. background.jpg (как обычное 1x изображение)
  2. background@ 2x.jpg (для отображения 2x / сетчатки).

Но когда я строю и запускаю, все работает нормально, кроме фона.Все остальные мои виджеты есть, но есть белый фон и изображение не показывается.

Далее я создал два png-изображения для фона, добавил его в проект и запустил.На этот раз мой фон был показан.Я был озадачен, потому что согласно документации jpg изображение может использоваться в iphone с UIImage.

Я попытался снова с моими изображениями jpg и изменил код выше на этот

UIImageView *bgImageView            =   [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 246.0)];
bgImageView.image                   =   [UIImage imageNamed:@"background.jpg"]; //added extension
[self.view addSubview:bgImageView];
[bgImageView release];

Когда я запускаю приведенный выше код, отображается фоновое изображение, но 2x изображения не загружаются.Это показывает, что мое изображение JPG в порядке, и это не преступник.Поэтому, когда я просто даю имя изображения без расширения, файлы png (как 1x, так и 2x) загружаются на соответствующие устройства, файлы jpg не загружаются вообще.Похоже, ошибка (в SDK или документации).iOS 4 здесь для хорошего года.почему никто не заметил это?Также есть какой-либо вариант для меня, кроме как конвертировать все мои изображения в PNG?

РЕДАКТИРОВАТЬ:

Ну, два дня на вопрос, ноль ответов.Я уже конвертировал все свои изображения в png, и эта часть моего проекта выполнена (так как мой проект не мог ждать ...).Тем не менее, ради себя и ради всех, кто столкнется с этим в будущем, я хотел бы узнать больше об этой проблеме.По крайней мере, кто-то может подтвердить, что это действительно яблочная ошибка.Я начинаю вознаграждение, чтобы больше людей могли видеть эту ветку.

ВНОВЬ РЕДАКТИРОВАТЬ

Осталось 2 дня до окончания этой награды.Спасибо всем, кто откликнулся.Но позвольте мне уточнить одну вещь.Я уже сказал, что я преобразовал все мои изображения в PNG, и я пошел дальше.Я просто хотел получить подтверждение, что imageNamed одинаково обрабатывает файлы jpg и png.Документация определенно говорит, что это произойдет (если Apple не написала это где-нибудь, кроме UIImage документации).Если документация верна, мой код не помог мне по двум возможным причинам:

  1. Это ошибка в imageNamed.Если это причина, то у меня не так уж много вариантов, кроме как подать отчет об ошибке, изменить мои изображения на png или написать обертку (как сказал Чандан в своем ответе) и двигаться дальше ..
  2. Существует некоторая проблема с изображением jpeg, которое я использовал .Ну, я не фотошоп парень.Но я использовал изображение RGBA jpg.Если изображение имеет значение, я готов спросить моего друга-дизайнера и предоставить больше информации.

Еще одна вещь. Этот пост также просто рассказывает об этой проблеме.Но он не знает причину этого.Так что я не одинок.

РЕДАКТИРОВАТЬ: КОНЕЦ

Ну, это что-то, связанное с самим изображением.Я гуглил, скачал несколько образцов изображений в формате JPEG и поиграл с ним.Некоторые из них отображаются правильно, а некоторые нет.Поскольку время ограничения истекло, я передаю границы PengOne, который попытался воспроизвести ошибку и успешно загрузил изображение jpg без расширения, заставив меня работать с большим количеством изображений.Спасибо всем, кто пытался помочь.

Ответы [ 5 ]

11 голосов
/ 15 июля 2011

Согласно классу UIImage Ссылка:

Обсуждение

Этот метод ищет в системных кэшах объект изображения с указанное имя и возвращает этот объект, если он существует. Если соответствие объект изображения еще не находится в кеше, этот метод загружает изображение данные из указанного файла, кэширует его, а затем возвращает результирующий объект.

На устройстве под управлением iOS 4 или более поздней версии поведение идентично, если Экран устройства имеет масштаб 1,0. Если экран имеет масштаб 2,0, этот метод сначала ищет файл изображения с тем же именем файла с добавленным к нему суффиксом @ 2x. Например, если имя файла Кнопка, он сначала ищет кнопку @ 2x. Если он находит 2x, он загружает это изображение и устанавливает свойство масштаба возвращенного объекта UIImage до 2.0. В противном случае он загружает неизмененное имя файла и устанавливает масштаб свойство до 1,0. См. Руководство по программированию приложений iOS для получения дополнительной информации информация о поддержке изображений с различными масштабными коэффициентами. Специальный

Вопросы

В iOS 4 и более поздних, имя файла указывать не обязательно расширение имени файла До iOS 4 необходимо указать имя файла расширение.

Поскольку вы ориентируетесь на iOS 4.0 и более поздние версии, вам не нужно расширение имени файла. Я пытался воспроизвести эту потенциальную ошибку, но она работала, как и ожидалось, без расширений имени файла.

Вот несколько идей о том, что может создать ошибку в вашем приложении:

  1. Возможно, проблема в кеше, если вы в какой-то момент изменили свои изображения.

  2. Если вы решите не использовать расширения имени файла, и у вас есть и "background.jpg", и "background.png" в качестве опций, предпочтение отдается использованию файла ".png".

  3. Если вы установите целевое значение для iOS 4.0 и более поздних версий после первого запуска приложения, тогда потребуется расширение имени файла, и изображение может быть кэшировано пустым, что возвращает к теории 1.

Это лучшее, что я могу из этого сделать.

7 голосов
/ 13 июля 2011

Напишите обертку, чтобы получить изображение вроде

-(UIImage*) getImage:(NSString*)imageName{

    UIImage *image;

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {

        // RETINA DISPLAY
        NSString *jpegFile = [imageName stringByAppendingString:@"@2x.jpg"];
        image = [UIImage imageNamed:jpegFile];
    }
    else{

        NSString *jpegFile = [imageName stringByAppendingString:@".jpg"];
        image = [UIImage imageNamed:jpegFile];
    }

    return image;
}

А из вашего кода звоните

bgImageView.image                   =   getImage(@"background");
5 голосов
/ 03 октября 2014

С рассветом Xcode 6 я обнаружил, что изображения JPG могут вообще не отображаться на определенных устройствах iOS7 (они могут работать на некоторых, но не на других, или они могут не работать ни на одном, и вы можете увидеть другой результатна другой машине разработчиков, похоже, нет никакой последовательности).Это независимо от того, на что изображение ссылается только в UIImageView в XIB или программно с помощью [UIImage imageNamed:] (который возвращает ноль).

После долгого почесывания в голове решением было переименовать* .jpg Расширение файла до * .png (при этом очевидно, что содержимое файла остается в виде данных JPG).

HTH

1 голос
/ 08 июля 2011

Вам просто нужно указать полное имя изображения.

bgImageView.image = [UIImage imageNamed:@"background.jpg"]; 

не оставляйте расширение.

Что касается @ 2x, нет необходимости вызывать его где-либо в коде.Если вы правильно пишете код, нет необходимости проверять наличие дисплея сетчатки, как некоторые здесь предложили.

0 голосов
/ 12 июля 2011

Вы можете использовать jpgs, только что попробовал сам, и это сработало. Единственное предложение - как вы его создаете. Попробуйте это так:

stockImage = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Morbo.jpg"]];

stockImage.frame = CGRectMake(0,0, self.view.bounds.size.width, self.view.bounds.size.height)  ;

[self.view addSubview:stockImage];

Это изображение, которое я использовал:

http://futurama.wikia.com/wiki/File:Morbo.jpg

...