Jpg изображения в iphone и 2x изображения
Я работаю над приложением 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];
Я добавил два изображения,
- background.jpg(как нормальное изображение 1x)
- [email protected](для 2x/сетчатки
дисплей).
Но когда я строю и запускаю, все работает нормально, за исключением фона. Все мои другие виджеты есть, но есть белый фон, и изображение не отображается.
Затем я создал два png-изображения для своего фона, добавил его в проект и побежал. На этот раз мой фон был показан. Я был озадачен, потому что согласно documentation 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];
Когда я запускаю приведенный выше код, отображается фоновое изображение, но 2 изображения не загружаются. Это показывает, что мой jpg-образ в порядке, и это не преступник. Поэтому, когда я просто указываю имя изображения без расширения, файлы png (как 1x, так и 2x) загружаются на соответствующие устройства, файлы jpg вообще не загружаются.
Похож на ошибку (либо в sdk, либо в документации). iOS 4 находится здесь в течение хорошего года. почему никто этого не заметил? Также есть ли какой-либо вариант для меня, кроме как преобразовать все мои изображения в png?
EDIT:
Хорошо, два дня на вопрос, нулевые ответы. Я уже преобразовал все мои изображения в png, и эта часть моего проекта выполнена (так как мой проект не мог дождаться..). Тем не менее, ради меня самого и ради всех, кто сталкивается с этим в будущем, я хотел бы узнать больше об этой проблеме. По крайней мере, кто-то может подтвердить, что это действительно яблочная ошибка. Я начинаю щедрость, чтобы больше людей могли видеть эту тему.
ИЗМЕНИТЬ СНОВА
2 дня, оставшиеся для завершения этой награды. Спасибо всем, кто ответил. Но позвольте мне прояснить одно. Я уже сказал, что все мои образы преобразовал в png, и я двинулся вперед. Я просто хотел получить подтверждение, что imageNamed
обрабатывает файлы jpg и png одинаково. Документация, безусловно, говорит, что это будет (если Apple не написала ее где-то кроме документации UIImage
). Если документация правильная, мой код мне не удалось из-за двух возможных причин.
- Это ошибка в
imageNamed
. Если это причина, то у меня нет слишком много опций, кроме файла, отчета об ошибке, изменения моих изображений в png или записи обертки (как сказал Чандан в его ответе) и двигаться дальше.
- Есть некоторая проблема с изображением jpeg, которое я использовал. Ну, я не парень из фотошопа. Но я использовал
Изображение RGBA jpg. Если изображение имеет значение, я готов спросить моего дизайнера
друг и предоставить дополнительную информацию.
Еще одна вещь. Это сообщение также просто рассказывает об этой проблеме. Но он не знает причины. Поэтому я не одинок.
EDIT: END
Ну, это связано с самим изображением. Я googled и скачал некоторые образцы jpeg изображений и играл с ним. Некоторые из них показываются правильно, а некоторые нет. Поскольку время ограничено, я даю ограниченность PengOne, который пытался воспроизвести ошибку и успешно загрузил jpg-изображение без расширения, заставив меня работать с большим количеством изображений. Спасибо всем, кто пытался помочь.
Ответы
Ответ 1
Согласно UIImage
Ссылка на класс:
Обсуждение
Этот метод просматривает системные кэши для объекта изображения с помощью указанное имя и возвращает этот объект, если он существует. Если совпадение объект изображения еще не находится в кеше, этот метод загружает изображение данных из указанного файла, кэширует его, а затем возвращает результирующий объект.
На устройстве под управлением iOS 4 или более поздней версии поведение идентично, если экран устройств имеет масштаб 1,0. Если экран имеет шкалу 2,0, этот метод сначала ищет файл изображения с тем же именем файла с добавленным к нему суффиксом @2x. Например, если имя файла, он сначала ищет кнопку @2x. Если он находит 2x, он загружает это изображение и задает свойство scale возвращаемого объекта UIImage до 2.0. В противном случае он загружает немодифицированное имя файла и устанавливает масштаб свойство 1.0. См. Руководство по программированию приложений iOS для получения дополнительной информации. информация о поддержке изображений с различными масштабными коэффициентами. Специальный
Вопросы
В iOS 4 и более поздних версиях имя файла не требуется указывать расширение имени файла. Перед iOS 4 вы должны указать имя файла расширение.
Поскольку вы ориентируетесь на iOS 4.0 и более поздние версии, вам нужно не расширять имя файла. Я попытался воспроизвести эту потенциальную ошибку, но она работала как ожидалось для меня без расширений имени файла.
Вот некоторые идеи о том, что, возможно, пошло не так, чтобы создать этот эффект в вашем приложении:
-
Возможно, проблема возникает из кеша, если вы изменили свои изображения в какой-то момент.
-
Если вы предпочитаете не использовать расширения имени файла, и у вас есть как "background.jpg", так и "background.png" в качестве параметров, предпочтение, похоже, заключается в использовании файла ".png".
-
Если вы установите цель на iOS 4.0 и позже после первого запуска приложения, тогда потребуется расширение имени файла, и изображение может быть кэшировано пустым, что приводит к теории 1.
Это лучшее, что я могу сделать из этого.
Ответ 2
Напишите оболочку, чтобы получить изображение, подобное
-(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");
Ответ 3
С рассветом Xcode 6 я обнаружил, что изображения JPG могут вообще не отображаться на некоторых устройствах iOS7 (они могут работать на некоторых, но не на других, или они могут не работать ни на одном, и вы можете видеть другой результат на другой машине разработчика, похоже, нет никакой последовательности). Это независимо от того, ссылается ли изображение только на UIImageView в XIB или программно с помощью [UIImage imageNamed:] (который возвращает нуль).
После долгое время царапая мою голову, решение заключалось в том, чтобы переименовать расширение *.jpg в файл *.png(в то время как явно оставляя содержимое файла как данные JPG).
НТН
Ответ 4
Вам просто нужно предоставить полное имя изображения.
bgImageView.image = [UIImage imageNamed:@"background.jpg"];
не оставляйте расширение.
Что касается @2x, нет необходимости вызывать его в любом месте кода. Если вы правильно закодировали, нет необходимости тестировать дисплей сетчатки, как некоторые из них предложили.
Ответ 5
Вы можете использовать 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