JPG изображение не загружается с UIImage imageNamed
Я прочитал по ссылке, что с iOS версии 4.+ с методом imageNamed
из UIImage
объект, расширение файла не требуется.
От UIImage
ссылка на класс:
Особые соображения.
В iOS 4 и более поздних версиях имя файла не обязательно для указания расширения имени файла. До iOS 4 необходимо указать расширение имени файла.
Но похоже, что это работает только с файлами PNG.
Если мой код:
[UIImage imageNamed:@"test"];
- Изображение загружается только если файл
test.png
- Изображение не загружается, если оно
test.jpg
,
Для меня это большая проблема, потому что мне нужно поддерживать динамическую загрузку изображения (я не знаю во время выполнения, является ли изображение, которое я хочу загрузить, png
или же jpg
).
Не могли бы вы мне помочь пожалуйста?
Благодарю.
2 ответа
В последнем справочнике разработчика говорится о недостающей части информации:
Особые замечания В 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;
}
Если у вас есть эти изображения в вашем приложении, вы ДОЛЖНЫ знать их расширения.
Если вы получаете их из онлайн-источника и используете их как 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;
}
Согласно верхнему ответу в этом вопросе.