Изображение JPG не загружается с помощью UIImage imageNamed
Я прочитал ссылку, что из iOS версии 4. + с помощью метода imageNamed
объекта UIImage
расширение файла не требуется.
Из UIImage
ссылки на класс:
Особые соображения.
В iOS 4 и более поздних версиях имя файла не требуется указывать расширение имени файла. Перед iOS 4 вы должны указать имя файла расширение.
Но похоже, что это работает только с файлами PNG.
Если мой код:
[UIImage imageNamed:@"test"];
- Изображение загружается, только если файл
test.png
- Изображение не загружается, если оно
test.jpg
.
Для меня это большая проблема, потому что мне нужно поддерживать динамическую загрузку изображений (во время выполнения я не знаю, если изображение, которое я хочу загрузить, это png
или jpg
).
Пожалуйста, помогите мне?
Спасибо.
Ответы
Ответ 1
Последняя ссылка для разработчиков указывает на недостающую часть информации:
Особые соображения На iOS 4 и более поздних версиях, если файл находится в формате PNG, нет необходимости указывать расширение имени файла .PNG. Перед iOS 4 вы должны указать расширение имени файла.
Одна из возможных причин того, что библиотека дает специальное лечение PNG, заключается в том, что iOS-оборудование оптимизировано для PNG. Изображения PNG, хранящиеся в комплекте приложений, оптимизируются с помощью Xcode, изменяя порядок байтов изображений PNG в соответствии с графическим чипом устройства iPhone. (см. этот вопрос: Является ли PNG предпочтительным для JPEG для всех файлов изображений в iOS?).
Если вы знаете, что у вас будет только PNG или JPG, альтернативное решение - создать категорию в UIImage, как показано ниже.
- (UIImage*) jgcLoadPNGorJPGImageWithName:(NSString*)name {
UIImage * value;
if (nil != name) {
value = [UIImage imageNamed:name];
if (nil == value) {
NSString * jpgName = [NSString stringWithFormat:@"%@.jpg", name];
value = [UIImage imageNamed:jpgName];
}
}
return value;
}
Ответ 2
Если у вас есть эти изображения в комплекте, вы ДОЛЖНЫ знать их расширения.
Если вы получаете их из онлайн-источника, и у вас есть они как NSData, вы можете использовать этот код здесь, чтобы определить тип.
+ (NSString *)contentTypeForImageData:(NSData *)data {
uint8_t c;
[data getBytes:&c length:1];
switch (c) {
case 0xFF:
return @"image/jpeg";
case 0x89:
return @"image/png";
case 0x47:
return @"image/gif";
case 0x49:
case 0x4D:
return @"image/tiff";
}
return nil;
}
В соответствии с главным ответом в этом вопросе.