diff options
Diffstat (limited to 'ml/dlib/dlib/image_loader/image_loader.h')
-rw-r--r-- | ml/dlib/dlib/image_loader/image_loader.h | 863 |
1 files changed, 0 insertions, 863 deletions
diff --git a/ml/dlib/dlib/image_loader/image_loader.h b/ml/dlib/dlib/image_loader/image_loader.h deleted file mode 100644 index 4fa29dab2..000000000 --- a/ml/dlib/dlib/image_loader/image_loader.h +++ /dev/null @@ -1,863 +0,0 @@ -// Copyright (C) 2006 Davis E. King (davis@dlib.net) -// License: Boost Software License See LICENSE.txt for the full license. -#ifndef DLIB_IMAGE_LOADEr_ -#define DLIB_IMAGE_LOADEr_ - -#include "image_loader_abstract.h" -#include <iostream> -#include <sstream> -#include "../algs.h" -#include "../pixel.h" -#include "../image_saver/dng_shared.h" -#include "../entropy_decoder_model.h" -#include "../entropy_decoder.h" -#include "../uintn.h" -#include "../image_transforms/assign_image.h" -#include <algorithm> -#include "../vectorstream.h" - -namespace dlib -{ - -// ---------------------------------------------------------------------------------------- - - class image_load_error : public dlib::error { - public: image_load_error(const std::string& str) : error(EIMAGE_LOAD,str){} - }; - -// ---------------------------------------------------------------------------------------- - - template < - typename image_type - > - void load_bmp ( - image_type& image_, - std::istream& in_ - ) - { - image_view<image_type> image(image_); - try - { - unsigned long bytes_read_so_far = 0; - unsigned long bfSize; - unsigned long bfOffBits; - unsigned long bfReserved; - unsigned long biSize; - unsigned long biWidth; - unsigned long biHeight; - unsigned short biBitCount; - unsigned long biCompression; - /* - unsigned long biSizeImage; - unsigned long biClrUsed; - unsigned long biClrImportant; - */ - unsigned long a, b, c, d, i; - - using namespace std; - - streambuf& in = *in_.rdbuf(); - // streamsize num; - unsigned char buf[100]; - - - // first make sure the BMP starts with BM - if (in.sgetn(reinterpret_cast<char*>(buf),2) != 2) - throw image_load_error("bmp load error 1: header error"); - bytes_read_so_far += 2; - - if (buf[0] != 'B' || buf[1] != 'M') - throw image_load_error("bmp load error 2: header error"); - - // now read the BITMAPFILEHEADER - if (in.sgetn(reinterpret_cast<char*>(buf),12) != 12) - throw image_load_error("bmp load error 3: header error"); - - bytes_read_so_far += 12; - - i = 0; - a = buf[i]; b = buf[i+1]; c = buf[i+2]; d = buf[i+3]; - bfSize = a | (b<<8) | (c<<16) | (d<<24); - - i = 4; - a = buf[i]; b = buf[i+1]; c = buf[i+2]; d = buf[i+3]; - bfReserved = a | (b<<8) | (c<<16) | (d<<24); - - i = 8; - a = buf[i]; b = buf[i+1]; c = buf[i+2]; d = buf[i+3]; - bfOffBits = a | (b<<8) | (c<<16) | (d<<24); - - // if this value isn't zero then there is something wrong - // with this bitmap. - if (bfReserved != 0) - throw image_load_error("bmp load error 4: reserved area not zero"); - - - // load the BITMAPINFOHEADER - if (in.sgetn(reinterpret_cast<char*>(buf),40) != 40) - throw image_load_error("bmp load error 5: file too short"); - bytes_read_so_far += 40; - - - i = 0; - a = buf[i]; b = buf[i+1]; c = buf[i+2]; d = buf[i+3]; - biSize = a | (b<<8) | (c<<16) | (d<<24); - - i += 4; - a = buf[i]; b = buf[i+1]; c = buf[i+2]; d = buf[i+3]; - biWidth = a | (b<<8) | (c<<16) | (d<<24); - - i += 4; - a = buf[i]; b = buf[i+1]; c = buf[i+2]; d = buf[i+3]; - biHeight = a | (b<<8) | (c<<16) | (d<<24); - - i += 4+2; - a = buf[i]; b = buf[i+1]; - biBitCount = static_cast<unsigned short>(a | (b<<8)); - - i += 2; - a = buf[i]; b = buf[i+1]; c = buf[i+2]; d = buf[i+3]; - biCompression = a | (b<<8) | (c<<16) | (d<<24); - - /* - i += 4; - a = buf[i]; b = buf[i+1]; c = buf[i+2]; d = buf[i+3]; - biSizeImage = a | (b<<8) | (c<<16) | (d<<24); - - i += 4+4+4; - a = buf[i]; b = buf[i+1]; c = buf[i+2]; d = buf[i+3]; - biClrUsed = a | (b<<8) | (c<<16) | (d<<24); - - i += 4; - a = buf[i]; b = buf[i+1]; c = buf[i+2]; d = buf[i+3]; - biClrImportant = a | (b<<8) | (c<<16) | (d<<24); - */ - - - if (biSize != 40) - throw image_load_error("bmp load error 6: header too small"); - - // read and discard any extra bytes that are part of the header - if (biSize > 40) - { - if (in.sgetn(reinterpret_cast<char*>(buf),biSize-40) != static_cast<long>(biSize - 40)) - { - throw image_load_error("bmp load error 7: header too small"); - } - bytes_read_so_far += biSize-40; - } - - image.set_size(biHeight, biWidth); - - switch (biBitCount) - { - case 1: - { - // figure out how the pixels are packed - long padding; - if (bfSize - bfOffBits == biWidth*biHeight/8) - padding = 0; - else - padding = 4 - ((biWidth+7)/8)%4; - - const unsigned int palette_size = 2; - unsigned char red[palette_size]; - unsigned char green[palette_size]; - unsigned char blue[palette_size]; - - for (unsigned int i = 0; i < palette_size; ++i) - { - if (in.sgetn(reinterpret_cast<char*>(buf),4) != 4) - { - throw image_load_error("bmp load error 20: color palette missing"); - } - bytes_read_so_far += 4; - blue[i] = buf[0]; - green[i] = buf[1]; - red[i] = buf[2]; - } - - - // seek to the start of the pixel data - while (bytes_read_so_far != bfOffBits) - { - const long to_read = (long)std::min(bfOffBits - bytes_read_so_far, (unsigned long)sizeof(buf)); - if (in.sgetn(reinterpret_cast<char*>(buf), to_read) != to_read) - { - throw image_load_error("bmp load error: missing data"); - } - bytes_read_so_far += to_read; - } - - // load the image data - for (long row = biHeight-1; row >= 0; --row) - { - for (unsigned long col = 0; col < biWidth; col+=8) - { - if (in.sgetn(reinterpret_cast<char*>(buf),1) != 1) - { - throw image_load_error("bmp load error 21.6: file too short"); - } - - unsigned char pixels[8]; - - pixels[0] = (buf[0]>>7); - pixels[1] = ((buf[0]>>6)&0x01); - pixels[2] = ((buf[0]>>5)&0x01); - pixels[3] = ((buf[0]>>4)&0x01); - pixels[4] = ((buf[0]>>3)&0x01); - pixels[5] = ((buf[0]>>2)&0x01); - pixels[6] = ((buf[0]>>1)&0x01); - pixels[7] = ((buf[0])&0x01); - - for (int i = 0; i < 8 && col+i < biWidth; ++i) - { - rgb_pixel p; - p.red = red[pixels[i]]; - p.green = green[pixels[i]]; - p.blue = blue[pixels[i]]; - assign_pixel(image[row][col+i],p); - } - } - if (in.sgetn(reinterpret_cast<char*>(buf),padding) != padding) - throw image_load_error("bmp load error 9: file too short"); - } - - - - } break; - case 4: - { - // figure out how the pixels are packed - long padding; - if (bfSize - bfOffBits == biWidth*biHeight/2) - padding = 0; - else - padding = 4 - ((biWidth+1)/2)%4; - - const unsigned int palette_size = 16; - unsigned char red[palette_size]; - unsigned char green[palette_size]; - unsigned char blue[palette_size]; - - for (unsigned int i = 0; i < palette_size; ++i) - { - if (in.sgetn(reinterpret_cast<char*>(buf),4) != 4) - { - throw image_load_error("bmp load error 20: color palette missing"); - } - bytes_read_so_far += 4; - blue[i] = buf[0]; - green[i] = buf[1]; - red[i] = buf[2]; - } - - - // seek to the start of the pixel data - while (bytes_read_so_far != bfOffBits) - { - const long to_read = (long)std::min(bfOffBits - bytes_read_so_far, (unsigned long)sizeof(buf)); - if (in.sgetn(reinterpret_cast<char*>(buf), to_read) != to_read) - { - throw image_load_error("bmp load error: missing data"); - } - bytes_read_so_far += to_read; - } - - // load the image data - for (long row = biHeight-1; row >= 0; --row) - { - for (unsigned long col = 0; col < biWidth; col+=2) - { - if (in.sgetn(reinterpret_cast<char*>(buf),1) != 1) - { - throw image_load_error("bmp load error 21.7: file too short"); - } - - const unsigned char pixel1 = (buf[0]>>4); - const unsigned char pixel2 = (buf[0]&0x0F); - - rgb_pixel p; - p.red = red[pixel1]; - p.green = green[pixel1]; - p.blue = blue[pixel1]; - assign_pixel(image[row][col], p); - - if (col+1 < biWidth) - { - p.red = red[pixel2]; - p.green = green[pixel2]; - p.blue = blue[pixel2]; - assign_pixel(image[row][col+1], p); - } - } - if (in.sgetn(reinterpret_cast<char*>(buf),padding) != padding) - throw image_load_error("bmp load error 9: file too short"); - } - - - - } break; - case 8: - { - // figure out how the pixels are packed - long padding; - if (bfSize - bfOffBits == biWidth*biHeight) - padding = 0; - else - padding = 4 - biWidth%4; - - // check for this case. It shouldn't happen but some BMP writers screw up the files - // so we have to do this. - if (biHeight*(biWidth+padding) > bfSize - bfOffBits) - padding = 0; - - const unsigned int palette_size = 256; - unsigned char red[palette_size]; - unsigned char green[palette_size]; - unsigned char blue[palette_size]; - - for (unsigned int i = 0; i < palette_size; ++i) - { - if (in.sgetn(reinterpret_cast<char*>(buf),4) != 4) - { - throw image_load_error("bmp load error 20: color palette missing"); - } - bytes_read_so_far += 4; - blue[i] = buf[0]; - green[i] = buf[1]; - red[i] = buf[2]; - } - - - // seek to the start of the pixel data - while (bytes_read_so_far != bfOffBits) - { - const long to_read = (long)std::min(bfOffBits - bytes_read_so_far, (unsigned long)sizeof(buf)); - if (in.sgetn(reinterpret_cast<char*>(buf), to_read) != to_read) - { - throw image_load_error("bmp load error: missing data"); - } - bytes_read_so_far += to_read; - } - - // Next we load the image data. - - // if there is no RLE compression - if (biCompression == 0) - { - for (long row = biHeight-1; row >= 0; --row) - { - for (unsigned long col = 0; col < biWidth; ++col) - { - if (in.sgetn(reinterpret_cast<char*>(buf),1) != 1) - { - throw image_load_error("bmp load error 21.8: file too short"); - } - - rgb_pixel p; - p.red = red[buf[0]]; - p.green = green[buf[0]]; - p.blue = blue[buf[0]]; - assign_pixel(image[row][col],p); - } - if (in.sgetn(reinterpret_cast<char*>(buf),padding) != padding) - throw image_load_error("bmp load error 9: file too short"); - } - } - else - { - // Here we deal with the psychotic RLE used by BMP files. - - // First zero the image since the RLE sometimes jumps over - // pixels and assumes the image has been zero initialized. - assign_all_pixels(image, 0); - - long row = biHeight-1; - long col = 0; - while (true) - { - if (in.sgetn(reinterpret_cast<char*>(buf),2) != 2) - { - throw image_load_error("bmp load error 21.9: file too short"); - } - - const unsigned char count = buf[0]; - const unsigned char command = buf[1]; - - if (count == 0 && command == 0) - { - // This is an escape code that means go to the next row - // of the image - --row; - col = 0; - continue; - } - else if (count == 0 && command == 1) - { - // This is the end of the image. So quit this loop. - break; - } - else if (count == 0 && command == 2) - { - // This is the escape code for the command to jump to - // a new part of the image relative to where we are now. - if (in.sgetn(reinterpret_cast<char*>(buf),2) != 2) - { - throw image_load_error("bmp load error 21.1: file too short"); - } - col += buf[0]; - row -= buf[1]; - continue; - } - else if (count == 0) - { - // This is the escape code for a run of uncompressed bytes - - if (row < 0 || col + command > image.nc()) - { - // If this is just some padding bytes at the end then ignore them - if (row >= 0 && col + count <= image.nc() + padding) - continue; - - throw image_load_error("bmp load error 21.2: file data corrupt"); - } - - // put the bytes into the image - for (unsigned int i = 0; i < command; ++i) - { - if (in.sgetn(reinterpret_cast<char*>(buf),1) != 1) - { - throw image_load_error("bmp load error 21.3: file too short"); - } - rgb_pixel p; - p.red = red[buf[0]]; - p.green = green[buf[0]]; - p.blue = blue[buf[0]]; - assign_pixel(image[row][col],p); - - ++col; - } - - // if we read an uneven number of bytes then we need to read and - // discard the next byte. - if ((command&1) != 1) - { - if (in.sgetn(reinterpret_cast<char*>(buf),1) != 1) - { - throw image_load_error("bmp load error 21.4: file too short"); - } - } - - continue; - } - - rgb_pixel p; - - if (row < 0 || col + count > image.nc()) - { - // If this is just some padding bytes at the end then ignore them - if (row >= 0 && col + count <= image.nc() + padding) - continue; - - throw image_load_error("bmp load error 21.5: file data corrupt"); - } - - // put the bytes into the image - for (unsigned int i = 0; i < count; ++i) - { - p.red = red[command]; - p.green = green[command]; - p.blue = blue[command]; - assign_pixel(image[row][col],p); - - ++col; - } - } - } - - - - } - break; - case 16: - throw image_load_error ("16 bit BMP images not supported"); - case 24: - { - // figure out how the pixels are packed - long padding; - if (bfSize - bfOffBits == biWidth*biHeight*3) - padding = 0; - else - padding = 4 - (biWidth*3)%4; - - // check for this case. It shouldn't happen but some BMP writers screw up the files - // so we have to do this. - if (biHeight*(biWidth*3+padding) > bfSize - bfOffBits) - padding = 0; - - // seek to the start of the pixel data - while (bytes_read_so_far != bfOffBits) - { - const long to_read = (long)std::min(bfOffBits - bytes_read_so_far, (unsigned long)sizeof(buf)); - if (in.sgetn(reinterpret_cast<char*>(buf), to_read) != to_read) - { - throw image_load_error("bmp load error: missing data"); - } - bytes_read_so_far += to_read; - } - - // load the image data - for (long row = biHeight-1; row >= 0; --row) - { - for (unsigned long col = 0; col < biWidth; ++col) - { - if (in.sgetn(reinterpret_cast<char*>(buf),3) != 3) - { - throw image_load_error("bmp load error 8: file too short"); - } - - rgb_pixel p; - p.red = buf[2]; - p.green = buf[1]; - p.blue = buf[0]; - assign_pixel(image[row][col], p); - - } - if (in.sgetn(reinterpret_cast<char*>(buf),padding) != padding) - throw image_load_error("bmp load error 9: file too short"); - } - - break; - } - case 32: - throw image_load_error ("32 bit BMP images not supported"); - default: - throw image_load_error("bmp load error 10: unknown color depth"); - - } - } - catch (...) - { - image.clear(); - throw; - } - - } - -// ---------------------------------------------------------------------------------------- - - template < - typename image_type - > - void load_dng ( - image_type& image_, - std::istream& in - ) - { - image_view<image_type> image(image_); - using namespace dng_helpers_namespace; - try - { - if (in.get() != 'D' || in.get() != 'N' || in.get() != 'G') - throw image_load_error("the stream does not contain a dng image file"); - - unsigned long version; - deserialize(version,in); - if (version != 1) - throw image_load_error("You need the new version of the dlib library to read this dng file"); - - unsigned long type; - deserialize(type,in); - - long width, height; - deserialize(width,in); - deserialize(height,in); - - if (width > 0 && height > 0) - image.set_size(height,width); - else - image.clear(); - - if (type != grayscale_float) - { - typedef entropy_decoder::kernel_2a decoder_type; - decoder_type decoder; - decoder.set_stream(in); - - entropy_decoder_model<256,decoder_type>::kernel_5a edm(decoder); - unsigned long symbol; - rgb_pixel p_rgb; - rgb_alpha_pixel p_rgba; - hsi_pixel p_hsi; - switch (type) - { - case rgb_alpha_paeth: - - for (long r = 0; r < image.nr(); ++r) - { - for (long c = 0; c < image.nc(); ++c) - { - p_rgba = predictor_rgb_alpha_paeth(image,r,c); - edm.decode(symbol); - p_rgba.red += static_cast<unsigned char>(symbol); - - edm.decode(symbol); - p_rgba.green += static_cast<unsigned char>(symbol); - - edm.decode(symbol); - p_rgba.blue += static_cast<unsigned char>(symbol); - - edm.decode(symbol); - p_rgba.alpha += static_cast<unsigned char>(symbol); - - assign_pixel(image[r][c],p_rgba); - } - } - break; - - case rgb_alpha: - - for (long r = 0; r < image.nr(); ++r) - { - for (long c = 0; c < image.nc(); ++c) - { - p_rgba = predictor_rgb_alpha(image,r,c); - edm.decode(symbol); - p_rgba.red += static_cast<unsigned char>(symbol); - - edm.decode(symbol); - p_rgba.green += static_cast<unsigned char>(symbol); - - edm.decode(symbol); - p_rgba.blue += static_cast<unsigned char>(symbol); - - edm.decode(symbol); - p_rgba.alpha += static_cast<unsigned char>(symbol); - - assign_pixel(image[r][c],p_rgba); - } - } - break; - - case rgb_paeth: - - for (long r = 0; r < image.nr(); ++r) - { - for (long c = 0; c < image.nc(); ++c) - { - p_rgb = predictor_rgb_paeth(image,r,c); - edm.decode(symbol); - p_rgb.red += static_cast<unsigned char>(symbol); - - edm.decode(symbol); - p_rgb.green += static_cast<unsigned char>(symbol); - - edm.decode(symbol); - p_rgb.blue += static_cast<unsigned char>(symbol); - - assign_pixel(image[r][c],p_rgb); - } - } - break; - - case rgb: - - for (long r = 0; r < image.nr(); ++r) - { - for (long c = 0; c < image.nc(); ++c) - { - p_rgb = predictor_rgb(image,r,c); - edm.decode(symbol); - p_rgb.red += static_cast<unsigned char>(symbol); - - edm.decode(symbol); - p_rgb.green += static_cast<unsigned char>(symbol); - - edm.decode(symbol); - p_rgb.blue += static_cast<unsigned char>(symbol); - - assign_pixel(image[r][c],p_rgb); - } - } - break; - - case hsi: - - for (long r = 0; r < image.nr(); ++r) - { - for (long c = 0; c < image.nc(); ++c) - { - p_hsi = predictor_hsi(image,r,c); - edm.decode(symbol); - p_hsi.h += static_cast<unsigned char>(symbol); - - edm.decode(symbol); - p_hsi.s += static_cast<unsigned char>(symbol); - - edm.decode(symbol); - p_hsi.i += static_cast<unsigned char>(symbol); - - assign_pixel(image[r][c],p_hsi); - } - } - break; - - case grayscale: - { - unsigned char p; - for (long r = 0; r < image.nr(); ++r) - { - for (long c = 0; c < image.nc(); ++c) - { - edm.decode(symbol); - p = static_cast<unsigned char>(symbol); - p += predictor_grayscale(image,r,c); - assign_pixel(image[r][c],p); - } - } - } - break; - - case grayscale_16bit: - { - uint16 p; - for (long r = 0; r < image.nr(); ++r) - { - for (long c = 0; c < image.nc(); ++c) - { - edm.decode(symbol); - p = static_cast<uint16>(symbol); - p <<= 8; - edm.decode(symbol); - p |= static_cast<uint16>(symbol); - - p += predictor_grayscale_16(image,r,c); - assign_pixel(image[r][c],p); - } - } - } - break; - - default: - throw image_load_error("corruption detected in the dng file"); - } // switch (type) - - edm.decode(symbol); - if (symbol != dng_magic_byte) - throw image_load_error("corruption detected in the dng file"); - edm.decode(symbol); - if (symbol != dng_magic_byte) - throw image_load_error("corruption detected in the dng file"); - edm.decode(symbol); - if (symbol != dng_magic_byte) - throw image_load_error("corruption detected in the dng file"); - edm.decode(symbol); - if (symbol != dng_magic_byte) - throw image_load_error("corruption detected in the dng file"); - } - else // if this is a grayscale_float type image - { - std::vector<int64> man(image.size()); - std::vector<char> expbuf; - // get the mantissa data - for (unsigned long j = 0; j < man.size(); ++j) - deserialize(man[j], in); - // get the compressed exponent data - deserialize(expbuf, in); - typedef entropy_decoder::kernel_2a decoder_type; - typedef entropy_decoder_model<256,decoder_type>::kernel_4a edm_exp_type; - vectorstream inexp(expbuf); - decoder_type decoder; - decoder.set_stream(inexp); - - edm_exp_type edm_exp(decoder); - float_details prev; - unsigned long i = 0; - // fill out the image - for (long r = 0; r < image.nr(); ++r) - { - for (long c = 0; c < image.nc(); ++c) - { - unsigned long exp1, exp2; - edm_exp.decode(exp1); - edm_exp.decode(exp2); - - float_details cur(man[i++],(exp2<<8) | exp1); - cur.exponent += prev.exponent; - cur.mantissa += prev.mantissa; - prev = cur; - - // Only use long double precision if the target image contains long - // doubles because it's slower to use those. - if (!is_same_type<typename image_traits<image_type>::pixel_type,long double>::value) - { - double temp = cur; - assign_pixel(image[r][c],temp); - } - else - { - long double temp = cur; - assign_pixel(image[r][c],temp); - } - } - } - unsigned long symbol; - edm_exp.decode(symbol); - if (symbol != dng_magic_byte) - throw image_load_error("corruption detected in the dng file"); - edm_exp.decode(symbol); - if (symbol != dng_magic_byte) - throw image_load_error("corruption detected in the dng file"); - edm_exp.decode(symbol); - if (symbol != dng_magic_byte) - throw image_load_error("corruption detected in the dng file"); - edm_exp.decode(symbol); - if (symbol != dng_magic_byte) - throw image_load_error("corruption detected in the dng file"); - } - } - catch (...) - { - image.clear(); - throw; - } - - } - -// ---------------------------------------------------------------------------------------- - - template <typename image_type> - void load_bmp ( - image_type& image, - const std::string& file_name - ) - { - std::ifstream fin(file_name.c_str(), std::ios::binary); - if (!fin) - throw image_load_error("Unable to open " + file_name + " for reading."); - load_bmp(image, fin); - } - -// ---------------------------------------------------------------------------------------- - - template <typename image_type> - void load_dng ( - image_type& image, - const std::string& file_name - ) - { - std::ifstream fin(file_name.c_str(), std::ios::binary); - if (!fin) - throw image_load_error("Unable to open " + file_name + " for reading."); - load_dng(image, fin); - } - -// ---------------------------------------------------------------------------------------- - -} - -#endif // DLIB_IMAGE_LOADEr_ - - - |