258 lines
6.7 KiB
C++
258 lines
6.7 KiB
C++
// ==========================================================
|
|
// FreeImage 3 Test Script
|
|
//
|
|
// Design and implementation by
|
|
// - Hervé Drolon (drolon@infonie.fr)
|
|
//
|
|
// This file is part of FreeImage 3
|
|
//
|
|
// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
|
|
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
|
|
// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
|
|
// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
|
|
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
|
|
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
|
|
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
|
|
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
|
|
// THIS DISCLAIMER.
|
|
//
|
|
// Use at your own risk!
|
|
// ==========================================================
|
|
|
|
|
|
#include "TestSuite.h"
|
|
|
|
// Local test functions
|
|
// ----------------------------------------------------------
|
|
|
|
void testSupportsNoPixels() {
|
|
for (int i = 0; i < FreeImage_GetFIFCount(); i++) {
|
|
FREE_IMAGE_FORMAT fmt = (FREE_IMAGE_FORMAT)i;
|
|
if (!FreeImage_FIFSupportsNoPixels(fmt)) {
|
|
// 'header only' loading mode is not supported
|
|
continue;
|
|
}
|
|
printf("testSupportsNoPixels (%s) ...\n", FreeImage_GetFormatFromFIF(fmt));
|
|
}
|
|
}
|
|
|
|
/**
|
|
Test header only bitmap allocation
|
|
*/
|
|
BOOL testHeader(const char *lpszPathName) {
|
|
int flags = FIF_LOAD_NOPIXELS;
|
|
|
|
FIBITMAP *dib1 = NULL, *dib2 = NULL;
|
|
|
|
try {
|
|
FREE_IMAGE_FORMAT fif = FreeImage_GetFIFFromFilename(lpszPathName);
|
|
|
|
dib1 = FreeImage_Load(fif, lpszPathName, flags);
|
|
if(!dib1) throw(1);
|
|
|
|
dib2 = FreeImage_Clone(dib1);
|
|
if(!dib2) throw(1);
|
|
|
|
FreeImage_Unload(dib1);
|
|
FreeImage_Unload(dib2);
|
|
|
|
return TRUE;
|
|
}
|
|
catch(int) {
|
|
if(dib1) FreeImage_Unload(dib1);
|
|
if(dib2) FreeImage_Unload(dib2);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
Parse metadata attached to a dib
|
|
*/
|
|
static void ParseMetadata(FIBITMAP *dib, FREE_IMAGE_MDMODEL model) {
|
|
FITAG *tag = NULL;
|
|
FIMETADATA *mdhandle = NULL;
|
|
|
|
mdhandle = FreeImage_FindFirstMetadata(model, dib, &tag);
|
|
|
|
if(mdhandle) {
|
|
do {
|
|
// get the tag key
|
|
const char *key = FreeImage_GetTagKey(tag);
|
|
// convert the tag value to a string
|
|
const char *value = FreeImage_TagToString(model, tag);
|
|
|
|
// print the tag
|
|
// note that most tags do not have a description,
|
|
// especially when the metadata specifications are not available
|
|
if(FreeImage_GetTagDescription(tag)) {
|
|
//cout << FreeImage_GetTagKey(tag) << "=" << value << " - " << FreeImage_GetTagDescription(tag) << "\n";
|
|
} else {
|
|
//cout << FreeImage_GetTagKey(tag) << "=" << value << " - " << "\n";
|
|
}
|
|
|
|
} while(FreeImage_FindNextMetadata(mdhandle, &tag));
|
|
}
|
|
|
|
FreeImage_FindCloseMetadata(mdhandle);
|
|
}
|
|
|
|
/**
|
|
Load the header of a bitmap (without pixel data)
|
|
*/
|
|
BOOL testHeaderData(const char *lpszPathName) {
|
|
int flags = FIF_LOAD_NOPIXELS;
|
|
|
|
FIBITMAP *dib = NULL;
|
|
|
|
try {
|
|
// load a file using the FIF_LOAD_NOPIXELS flag
|
|
FREE_IMAGE_FORMAT fif = FreeImage_GetFIFFromFilename(lpszPathName);
|
|
assert(FreeImage_FIFSupportsNoPixels(fif) == TRUE);
|
|
|
|
dib = FreeImage_Load(fif, lpszPathName, flags);
|
|
if(!dib) throw(1);
|
|
|
|
// check that dib does not contains pixels
|
|
BOOL bHasPixel = FreeImage_HasPixels(dib);
|
|
assert(bHasPixel == FALSE);
|
|
|
|
// use accessors
|
|
FREE_IMAGE_TYPE type = FreeImage_GetImageType(dib);
|
|
unsigned width = FreeImage_GetWidth(dib);
|
|
unsigned height = FreeImage_GetHeight(dib);
|
|
unsigned bpp = FreeImage_GetBPP(dib);
|
|
// parse some metadata (see e.g. FreeImage_FindFirstMetadata)
|
|
ParseMetadata(dib, FIMD_COMMENTS);
|
|
ParseMetadata(dib, FIMD_EXIF_MAIN);
|
|
ParseMetadata(dib, FIMD_EXIF_EXIF);
|
|
ParseMetadata(dib, FIMD_EXIF_GPS);
|
|
ParseMetadata(dib, FIMD_EXIF_MAKERNOTE);
|
|
ParseMetadata(dib, FIMD_IPTC);
|
|
ParseMetadata(dib, FIMD_XMP);
|
|
|
|
// you cannot access pixels
|
|
BYTE *bits = FreeImage_GetBits(dib);
|
|
assert(bits == NULL);
|
|
|
|
FreeImage_Unload(dib);
|
|
|
|
return TRUE;
|
|
}
|
|
catch(int) {
|
|
if(dib) FreeImage_Unload(dib);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
Test loading and saving of Exif raw data
|
|
*/
|
|
static BOOL
|
|
testExifRawFile(const char *lpszPathName, int load_flags, int save_flags) {
|
|
const char *lpszDstPathName = "raw_exif.jpg";
|
|
|
|
FIBITMAP *dib = NULL, *dst = NULL;
|
|
|
|
try {
|
|
// load an Exif file (jpeg file)
|
|
FREE_IMAGE_FORMAT fif = FreeImage_GetFIFFromFilename(lpszPathName);
|
|
|
|
dib = FreeImage_Load(fif, lpszPathName, load_flags);
|
|
if(!dib) throw(1);
|
|
|
|
// check access to raw Exif data
|
|
FITAG *tag = NULL;
|
|
BOOL bResult = FreeImage_GetMetadata(FIMD_EXIF_RAW, dib, "ExifRaw", &tag);
|
|
if(tag) {
|
|
const char *key = FreeImage_GetTagKey(tag);
|
|
WORD id = FreeImage_GetTagID(tag);
|
|
FREE_IMAGE_MDTYPE type = FreeImage_GetTagType(tag);
|
|
DWORD count = FreeImage_GetTagCount(tag);
|
|
DWORD length = FreeImage_GetTagLength(tag);
|
|
BYTE *value = (BYTE*)FreeImage_GetTagValue(tag);
|
|
|
|
// save as jpeg : Exif data should be preserved
|
|
FreeImage_Save(fif, dib, lpszDstPathName, save_flags);
|
|
|
|
// load and check Exif raw data
|
|
fif = FreeImage_GetFileType(lpszDstPathName);
|
|
|
|
dst = FreeImage_Load(fif, lpszDstPathName, load_flags);
|
|
if(!dst) throw(1);
|
|
|
|
FITAG *dst_tag = NULL;
|
|
BOOL bResult = FreeImage_GetMetadata(FIMD_EXIF_RAW, dib, "ExifRaw", &dst_tag);
|
|
if(dst_tag) {
|
|
const char *key = FreeImage_GetTagKey(dst_tag);
|
|
WORD dst_id = FreeImage_GetTagID(dst_tag);
|
|
FREE_IMAGE_MDTYPE dst_type = FreeImage_GetTagType(dst_tag);
|
|
DWORD dst_count = FreeImage_GetTagCount(dst_tag);
|
|
DWORD dst_length = FreeImage_GetTagLength(dst_tag);
|
|
BYTE *dst_value = (BYTE*)FreeImage_GetTagValue(dst_tag);
|
|
|
|
assert(length == dst_length);
|
|
}
|
|
|
|
FreeImage_Unload(dst);
|
|
}
|
|
|
|
FreeImage_Unload(dib);
|
|
|
|
return TRUE;
|
|
}
|
|
catch(int) {
|
|
if(dib) FreeImage_Unload(dib);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
// Main test functions
|
|
// ----------------------------------------------------------
|
|
|
|
void testHeaderOnly() {
|
|
const char *src_file_jpg = "exif.jpg";
|
|
const char *src_file_png = "sample.png";
|
|
|
|
BOOL bResult = TRUE;
|
|
|
|
printf("testHeaderOnly ...\n");
|
|
|
|
testSupportsNoPixels();
|
|
|
|
// JPEG plugin
|
|
bResult = testHeader(src_file_jpg);
|
|
assert(bResult);
|
|
|
|
bResult = testHeaderData(src_file_jpg);
|
|
assert(bResult);
|
|
|
|
// PNG plugin
|
|
bResult = testHeader(src_file_png);
|
|
assert(bResult);
|
|
|
|
bResult = testHeaderData(src_file_png);
|
|
assert(bResult);
|
|
|
|
// you cannot save 'header only' FIBITMAP
|
|
bResult = testExifRawFile(src_file_jpg, FIF_LOAD_NOPIXELS, 0);
|
|
assert(bResult == FALSE);
|
|
}
|
|
|
|
void testExifRaw() {
|
|
const char *src_file_jpg = "exif.jpg";
|
|
|
|
BOOL bResult = TRUE;
|
|
|
|
printf("testExifRaw ...\n");
|
|
|
|
// Exif raw metadata loading & saving
|
|
|
|
// check Exif raw metadata loading & saving
|
|
bResult = testExifRawFile(src_file_jpg, 0, 0);
|
|
assert(bResult);
|
|
|
|
}
|