Подтвердить что ты не робот

Изображение JPG не загружается с помощью UIImage imageNamed

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

Из UIImage ссылки на класс:

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

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

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

Если мой код:

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

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

Пожалуйста, помогите мне? Спасибо.

4b9b3361

Ответ 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;
}

В соответствии с главным ответом в этом вопросе.