JPG image doesn't load with UIImage imageNamed

I read on the reference that from iOS version 4.+ with the method imageNamed of UIImage object, the file extension is not required.

From UIImage class reference:

  • splash (launch image) in landscape mode?
  • How to access to an annotation attribute inside method calloutAccessoryControlTapped
  • Can I place noneditable text in UITextField
  • iOS App crashes at segue (breakpoint occurs at func prepareForSegue)
  • Getting video snapshot for thumbnail
  • NSComparisonResult and NSComparator - what are they?
  • Special Considerations.

    On iOS 4 and later, the name of the file is not required to specify
    the filename extension. Prior to iOS 4, you must specify the filename

    But it seems that this only work with PNG files.

    If my code is:

    [UIImage imageNamed:@"test"];
    • The image loads only if the file is test.png
    • The image doesn’t load if it’s test.jpg.

    For me it is a big problem because I need to maintain a dynamic image loading (I do not know at runtime if the image I want to load is png or jpg).

    Please can you help me?

    2 Solutions Collect From Internet About “JPG image doesn't load with UIImage imageNamed”

    The latest developer reference states the missing piece of information:

    Special Considerations
    On iOS 4 and later, if the file is in PNG format, it is not necessary to specify the .PNG filename extension. Prior to iOS 4, you must specify the filename extension.

    One possible reason that the library gives PNGs special treatment, is that the iOS hardware is optimized for PNGs. PNG images stored in the application bundle are optimized by Xcode, changing the byte order of the PNG images to match the graphics chip of the iPhone device. (see this question: Is PNG preferred over JPEG for all image files on iOS?).

    If you know that you will only have a PNG or a JPG, an alternative solution is to create a category on UIImage as per below.

    - (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;

    If you have these images bundled in your app, you SHOULD know their extensions.

    If you’re getting them from an online source and you have them as NSData, you can use this code here to determine the type.

    + (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;

    As per the top answer in this question.