JPG изображение не загружается с UIImage imageNamed - PullRequest
20 голосов
/ 22 августа 2011

Я прочитал по ссылке, что из iOS версии 4. + с методом imageNamed объекта UIImage расширение файла не требуется.

С UIImage ссылка на класс:

Особые соображения.

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

Но, похоже, это работает только с файлами PNG.

Если мой код:

[UIImage imageNamed:@"test"];
  • Изображение загружается, только если файл test.png
  • Изображение не загружается, если оно test.jpg.

Для меня это большая проблема, потому что мне нужно поддерживать динамическую загрузку изображения (я не знаю во время выполнения, является ли изображение, которое я хочу загрузить, png или jpg).

Пожалуйста, вы можете мне помочь?
Спасибо.

Ответы [ 2 ]

3 голосов
/ 03 апреля 2015

В последнем справочнике разработчика указана недостающая часть информации:

Особые соображения В 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;
}
0 голосов
/ 02 апреля 2015

Если у вас есть эти изображения в вашем приложении, вы ДОЛЖНЫ знать их расширения.

Если вы получаете их из онлайн-источника и используете их как 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;
}

Согласно верхнему ответу в этом вопросе.

...