Yalantis/uCrop · error · CImgIOException

load_other(): Failed to recognize format of file '%s'.

Error message

load_other(): Failed to recognize format of file '%s'.

What it means

load_other() opened the file successfully but none of the registered format handlers (png/jpg/bmp/etc.) recognized it, so CImg gives up with CImgIOException. The file exists but its content doesn't match any supported or loadable image format (bad extension, corrupt data, or a format without a compiled-in handler).

Source

Thrown at ucrop/src/main/jni/CImg.h:60178

      try { load_magick(filename); }
      catch (CImgException&) {
        try { load_imagemagick_external(filename); }
        catch (CImgException&) {
          try { load_graphicsmagick_external(filename); }
          catch (CImgException&) {
            try { load_cimg(filename); }
            catch (CImgException&) {
              try {
                cimg::fclose(cimg::fopen(filename,"rb"));
              } catch (CImgException&) {
                cimg::exception_mode(omode);
                throw CImgIOException(_cimg_instance
                                      "load_other(): Failed to open file '%s'.",
                                      cimg_instance,
                                      filename);
              }
              cimg::exception_mode(omode);
              throw CImgIOException(_cimg_instance
                                    "load_other(): Failed to recognize format of file '%s'.",
                                    cimg_instance,
                                    filename);
            }
          }
        }
      }
      cimg::exception_mode(omode);
      return *this;
    }

    //! Load image using various non-native ways \newinstance.
    static CImg<T> get_load_other(const char *const filename) {
      return CImg<T>().load_other(filename);
    }

    //@}
    //---------------------------

View on GitHub (pinned to f788b534b4)

Solutions

  1. Check the file magic bytes (first 8-16 bytes) match the claimed format before loading.
  2. Re-download or re-export the file; it is likely corrupt or truncated.
  3. Convert the image to a supported format (PNG/BMP) with an external tool first.
  4. Rebuild CImg with the needed format support (e.g., link libpng/libjpeg).

Example fix

// before
CImg<unsigned char> img(path); // throws if format unrecognized
// after
std::ifstream f(path, std::ios::binary);
char magic[8] = {0}; f.read(magic, 8);
bool is_png = (unsigned char)magic[0]==0x89 && magic[1]=='P';
if (is_png) { CImg<unsigned char> img(path); } else { /* reject */ }
Defensive patterns

Strategy: validation

Validate before calling

bool looksLikeImage(const char* p){ std::ifstream f(p,std::ios::binary); char m[8]={0}; f.read(m,8); fpos<size_t> sz=f.tellg(); (void)sz; return (unsigned char)m[0]==0x89 || m[0]==0xFF || m[0]=='B' || m[0]=='G' || m[0]=='P'; }

Try / catch

try { img.load(path); } catch (CImgIOException& e) { /* treat as corrupt: re-download or convert format */ }

Prevention

When it happens

Trigger: load()/load_other() on a file whose magic bytes don't match a compiled-in format handler: corrupt/truncated image, wrong extension, text file, or a format whose plugin isn't available in the build.

Common situations: Downloading truncated images over flaky networks, saving placeholder/encrypted files with .png extensions, CImg built without JPEG/PNG support attempting to load those formats.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of Yalantis/uCrop@f788b534b4 (2026-09-08). Data as JSON: /api/errors/69c8010cc23ea019. Report an issue: GitHub.