automatically detect type of image if no file extension is available

This commit is contained in:
louis 2015-04-02 07:50:14 +02:00
parent 60a41eb996
commit 4ae8e01ed9
3 changed files with 38 additions and 3 deletions

View File

@ -262,4 +262,5 @@ Version 0.3.3
Version 0.3.4
- fixed backward compatibility to VDR version < 2.1.1 where
cRecording::IsInUse() was introduced
cRecording::IsInUse() was introduced
- automatically detect type of image if no file extension is available

View File

@ -4,6 +4,7 @@
#include <string>
#include <dirent.h>
#include <iostream>
#include <fstream>
cImageLoader::cImageLoader() {
importer = NULL;
@ -77,8 +78,11 @@ bool cImageLoader::LoadImage(const char *fullpath) {
importer = new cImageImporterSVG;
else if (endswith(fullpath, ".jpg"))
importer = new cImageImporterJPG;
else
return false;
else {
importer = cImageImporter::CreateImageImporter(fullpath);
if (!importer)
return false;
}
return importer->LoadImage(fullpath);
}
@ -91,6 +95,35 @@ bool cImageLoader::LoadImage(std::string Path, std::string FileName, std::string
return LoadImage(imgFile.c_str());
}
cImageImporter* cImageImporter::CreateImageImporter(const char* path) {
char pngSig[] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };
char jpgSig[] = { 0xFF, 0xD8, 0xFF, 0xD9 };
char buffer[8] = { 0 };
ifstream f(path, ios::in | ios::binary);
f.read(buffer, 8);
if (!f)
return NULL;
if(buffer[0] == jpgSig[0] && buffer[1] == jpgSig[1]) {
f.seekg(-2, f.end);
f.read(buffer, 2);
if(buffer[0] == jpgSig[2] && buffer[1] == jpgSig[3]) {
f.close();
return new cImageImporterJPG;
}
} else if(buffer[0] == pngSig[0]
&& buffer[1] == pngSig[1]
&& buffer[2] == pngSig[2]
&& buffer[3] == pngSig[3]
&& buffer[4] == pngSig[4]
&& buffer[5] == pngSig[5]
&& buffer[6] == pngSig[6]
&& buffer[7] == pngSig[7]) {
f.close();
return new cImageImporterPNG;
}
return NULL;
}
//
// Image importer for PNG
//

View File

@ -22,6 +22,7 @@ public:
virtual bool LoadImage(const char *path) { return false; };
virtual void DrawToCairo(cairo_t *cr) {};
virtual void GetImageSize(int &width, int &height) {};
static cImageImporter* CreateImageImporter(const char* path);
};
// Image importer for PNG