00001 #ifndef Impala_Core_Array_ReadImage_h
00002 #define Impala_Core_Array_ReadImage_h
00003
00004 #include "Core/Array/Arrays.h"
00005 #include "Core/Array/ReadPng.h"
00006 #include "Core/Array/ReadJpg.h"
00007
00008 namespace Impala
00009 {
00010 namespace Core
00011 {
00012 namespace Array
00013 {
00014
00015
00019 template <class ArrayT>
00020 inline void
00021 ReadImageFromMemory(ArrayT*& dst, char *buf, int bufsize)
00022 {
00023 ILOG_VAR(Impala.Core.Array.ReadImageFromMemory);
00024 if (bufsize < 14)
00025 {
00026 ILOG_ERROR("Buffer size too small to identify file: " << bufsize
00027 << " bytes");
00028 return;
00029 }
00030
00031
00032 if (((buf[0] == -119) || (buf[0] == 137)) &&
00033 (buf[1] == 0x50) &&
00034 (buf[2] == 0x4e) &&
00035 (buf[3] == 0x47) &&
00036 (buf[4] == 0x0d) &&
00037 (buf[5] == 0x0a) &&
00038 (buf[6] == 0x1a) &&
00039 (buf[7] == 0x0a))
00040 {
00041 ReadPngFromMemory(dst, buf, bufsize);
00042 return;
00043 }
00044
00045
00046 if ((buf[0] == -1) &&
00047 (buf[1] == -40) &&
00048 (buf[2] == -1) &&
00049
00050
00051 (buf[6] == 0x4a) &&
00052 (buf[7] == 0x46) &&
00053 (buf[8] == 0x49) &&
00054 (buf[9] == 0x46) &&
00055 (buf[10] == 0x00))
00056 {
00057 ReadJpgFromMemory(dst, buf, bufsize);
00058 return;
00059 }
00060
00061
00062
00063 if ((buf[0] == -1) &&
00064 (buf[1] == -40) &&
00065 (buf[2] == -1) &&
00066 (buf[3] == -31) &&
00067
00068 (buf[8] == 0x45) &&
00069 (buf[9] == 0x78) &&
00070 (buf[10] == 0x69) &&
00071 (buf[11] == 0x66) &&
00072 (buf[12] == 0x00) &&
00073 (buf[13] == 0x00))
00074 {
00075 ReadJpgFromMemory(dst, buf, bufsize);
00076 return;
00077 }
00078
00079
00080 if ((buf[0] == -1) &&
00081 (buf[1] == -40) &&
00082 (buf[2] == -1) &&
00083 (buf[3] == -31) &&
00084
00085 (buf[6] == 0x45) &&
00086 (buf[7] == 0x78) &&
00087 (buf[8] == 0x69) &&
00088 (buf[9] == 0x66) &&
00089 (buf[10] == 0x00) &&
00090 (buf[11] == 0x00))
00091 {
00092 ReadJpgFromMemory(dst, buf, bufsize);
00093 return;
00094 }
00095
00096
00097 ILOG_ERROR("Unknown image file format! " << int(buf[0]) << " " <<
00098 int(buf[1]) << " " << int(buf[2]) << " " << int(buf[3]) << " "
00099 << int(buf[4]) << " " << int(buf[5]) << " " << int(buf[6]) <<
00100 " " << int(buf[7]) << " " << int(buf[8]) << " " << int(buf[9])
00101 << " " << int(buf[10]) << " " << int(buf[11]));
00102 }
00103
00104 }
00105 }
00106 }
00107
00108 #endif