Incorporated Changjiang Yang's patch that makes load_image() use the file

headers to decide how to load images instead of using their file extensions.
This makes load_image() work even when the files have the incorrect file
extensions.
This commit is contained in:
Davis King 2014-08-21 19:07:16 -04:00
parent 5a4f282348
commit 878ded28ba
2 changed files with 57 additions and 30 deletions

View File

@ -1,4 +1,4 @@
// Copyright (C) 2011 Davis E. King (davis@dlib.net), Nils Labugt
// Copyright (C) 2011 Davis E. King (davis@dlib.net), Nils Labugt, Changjiang Yang (yangcha@leidos.com)
// License: Boost Software License See LICENSE.txt for the full license.
#ifndef DLIB_LOAd_IMAGE_Hh_
#define DLIB_LOAd_IMAGE_Hh_
@ -8,37 +8,72 @@
#include "png_loader.h"
#include "jpeg_loader.h"
#include "image_loader.h"
#include <fstream>
namespace dlib
{
namespace image_file_type
{
enum type
{
BMP,
JPG,
PNG,
DNG,
UNKNOWN
};
type read_type(const std::string& fileName)
{
std::ifstream file(fileName, std::ios::in|std::ios::binary);
if (!file)
throw image_load_error("Unable to open file: " + fileName);
char buffer[9];
file.read((char*)buffer, 8);
buffer[8] = 0;
// Determine the true image type using link:
// http://en.wikipedia.org/wiki/List_of_file_signatures
if (strcmp(buffer, "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") == 0)
return PNG;
else if(buffer[0]=='\xff' && buffer[1]=='\xd8' && buffer[2]=='\xff')
return JPG;
else if(buffer[0]=='B' && buffer[1]=='M')
return BMP;
else if(buffer[0]=='D' && buffer[1]=='N' && buffer[2] == 'G')
return DNG;
return UNKNOWN;
}
};
template <typename image_type>
void load_image (
image_type& image,
const std::string& file_name
)
{
const std::string extension = tolower(right_substr(file_name,"."));
if (extension == "bmp")
load_bmp(image, file_name);
const image_file_type::type im_type = image_file_type::read_type(file_name);
switch (im_type)
{
case image_file_type::BMP: load_bmp(image, file_name); return;
case image_file_type::DNG: load_dng(image, file_name); return;
#ifdef DLIB_PNG_SUPPORT
else if (extension == "png")
load_png(image, file_name);
case image_file_type::PNG: load_png(image, file_name); return;
#endif
#ifdef DLIB_JPEG_SUPPORT
else if (extension == "jpeg" || extension == "jpg")
load_jpeg(image, file_name);
case image_file_type::JPG: load_jpeg(image, file_name); return;
#endif
else if (extension == "dng")
load_dng(image, file_name);
else
{
if (extension == "jpeg" || extension == "jpg")
}
if (im_type == image_file_type::JPG)
throw image_load_error("DLIB_JPEG_SUPPORT not #defined: Unable to load image in file " + file_name);
else if (extension == "png")
else if (im_type == image_file_type::PNG)
throw image_load_error("DLIB_PNG_SUPPORT not #defined: Unable to load image in file " + file_name);
else
throw image_load_error("Unknown file extension: Unable to load image in file " + file_name);
}
throw image_load_error("Unknown image file format: Unable to load image in file " + file_name);
}
}

View File

@ -19,18 +19,10 @@ namespace dlib
- image_type == an image object that implements the interface defined in
dlib/image_processing/generic_image.h
ensures
- let EXT == the extension of the file given by file_name converted
to lower case (i.e. the part of the file after the '.')
- if (EXT == "png") then
- performs: load_png(image, file_name);
- else if (EXT == "jpg" || EXT == "jpeg") then
- performs: load_jpeg(image, file_name);
- else if (EXT == "bmp") then
- performs: load_bmp(image, file_name);
- else if (EXT == "dng") then
- performs: load_dng(image, file_name);
- else
- throws image_load_error
- This function looks at the file extensions and file headers to try and figure
out what kind of image format is inside the given file. It then calls one of
load_png(), load_jpeg(), load_bmp(), or load_dng() as appropriate and stores
the resulting image into #image.
throws
- image_load_error
This exception is thrown if there is some error that prevents