| // This may look like C code, but it is really -*- C++ -*- |
| // |
| // Copyright Bob Friesenhahn, 1999, 2000, 2003 |
| // |
| // Test reading/writing BLOBs using Magick++ |
| // |
| |
| #include <Magick++.h> |
| #include <string> |
| #include <iostream> |
| #include <fstream> |
| |
| #if defined(MISSING_STD_IOS_BINARY) |
| # define IOS_IN_BINARY ios::in |
| #else |
| # define IOS_IN_BINARY ios::in | ios::binary |
| #endif |
| |
| using namespace std; |
| |
| using namespace Magick; |
| |
| // A derived Blob class to exercise updateNoCopy() |
| class myBlob : public Blob |
| { |
| public: |
| // Construct from open binary stream |
| myBlob( ifstream &stream_ ) |
| : Blob() |
| { |
| unsigned char* blobData = new unsigned char[100000]; |
| char* c= reinterpret_cast<char *>(blobData); |
| size_t blobLen=0; |
| while( (blobLen< 100000) && stream_.get(*c) ) |
| { |
| c++; |
| blobLen++; |
| } |
| if ((!stream_.eof()) || (blobLen == 0)) |
| { |
| cout << "Failed to stream into blob!" << endl; |
| exit(1); |
| } |
| |
| // Insert data into blob |
| updateNoCopy( reinterpret_cast<unsigned char*>(blobData), blobLen, |
| Blob::NewAllocator ); |
| } |
| }; |
| |
| |
| int main( int /*argc*/, char ** argv) |
| { |
| |
| // Initialize ImageMagick install location for Windows |
| InitializeMagick(*argv); |
| |
| int failures=0; |
| |
| try |
| { |
| string srcdir(""); |
| if(getenv("SRCDIR") != 0) |
| srcdir = getenv("SRCDIR"); |
| |
| string testimage; |
| |
| // |
| // Test reading BLOBs |
| // |
| { |
| string signature(""); |
| { |
| Image image(srcdir + "test_image.miff"); |
| signature = image.signature(); |
| } |
| |
| // Read raw data from file into BLOB |
| testimage = srcdir + "test_image.miff"; |
| ifstream in( testimage.c_str(), ios::in | IOS_IN_BINARY ); |
| if( !in ) |
| { |
| cout << "Failed to open file " << testimage << " for input!" << endl; |
| exit(1); |
| } |
| unsigned char* blobData = new unsigned char[100000]; |
| char* c=reinterpret_cast<char *>(blobData); |
| size_t blobLen=0; |
| while( (blobLen< 100000) && in.get(*c) ) |
| { |
| c++; |
| blobLen++; |
| } |
| if ((!in.eof()) || (blobLen == 0)) |
| { |
| cout << "Failed to read file " << testimage << " for input!" << endl; |
| exit(1); |
| } |
| in.close(); |
| |
| // Construct Magick++ Blob |
| Blob blob(static_cast<const unsigned char*>(blobData), blobLen); |
| delete [] blobData; |
| |
| // If construction of image fails, an exception should be thrown |
| { |
| // Construct with blob data only |
| Image image( blob ); |
| if ( image.signature() != signature ) |
| { |
| ++failures; |
| cout << "Line: " << __LINE__ |
| << " Image signature " |
| << image.signature() |
| << " != " |
| << signature << endl; |
| } |
| } |
| |
| { |
| // Construct with image geometry and blob data |
| Image image( blob, Geometry(148,99)); |
| if ( image.signature() != signature ) |
| { |
| ++failures; |
| cout << "Line: " << __LINE__ |
| << " Image signature " |
| << image.signature() |
| << " != " |
| << signature << endl; |
| } |
| } |
| |
| { |
| // Construct default image, and then read in blob data |
| Image image; |
| image.read( blob ); |
| if ( image.signature() != signature ) |
| { |
| ++failures; |
| cout << "Line: " << __LINE__ |
| << " Image signature " |
| << image.signature() |
| << " != " |
| << signature << endl; |
| } |
| } |
| |
| { |
| // Construct default image, and then read in blob data with |
| // image geometry |
| Image image; |
| image.read( blob, Geometry(148,99) ); |
| if ( image.signature() != signature ) |
| { |
| ++failures; |
| cout << "Line: " << __LINE__ |
| << " Image signature " |
| << image.signature() |
| << " != " |
| << signature << endl; |
| } |
| } |
| |
| } |
| |
| // Test writing BLOBs |
| { |
| Blob blob; |
| string signature(""); |
| { |
| Image image(srcdir + "test_image.miff"); |
| image.magick("MIFF"); |
| image.write( &blob ); |
| signature = image.signature(); |
| } |
| { |
| Image image(blob); |
| if ( image.signature() != signature ) |
| { |
| ++failures; |
| cout << "Line: " << __LINE__ |
| << " Image signature " |
| << image.signature() |
| << " != " |
| << signature << endl; |
| image.display(); |
| } |
| } |
| |
| } |
| // Test writing BLOBs via STL writeImages |
| { |
| Blob blob; |
| |
| list<Image> first; |
| readImages( &first, srcdir + "test_image_anim.miff" ); |
| writeImages( first.begin(), first.end(), &blob, true ); |
| } |
| |
| // Test constructing a BLOB from a derived class |
| { |
| |
| string signature(""); |
| { |
| Image image(srcdir + "test_image.miff"); |
| signature = image.signature(); |
| } |
| |
| // Read raw data from file into BLOB |
| testimage = srcdir + "test_image.miff"; |
| ifstream in( testimage.c_str(), ios::in | IOS_IN_BINARY ); |
| if( !in ) |
| { |
| cout << "Failed to open file for input!" << endl; |
| exit(1); |
| } |
| |
| myBlob blob( in ); |
| in.close(); |
| |
| Image image( blob ); |
| if ( image.signature() != signature ) |
| { |
| ++failures; |
| cout << "Line: " << __LINE__ |
| << " Image signature " |
| << image.signature() |
| << " != " |
| << signature << endl; |
| } |
| } |
| } |
| |
| catch( Exception &error_ ) |
| { |
| cout << "Caught exception: " << error_.what() << endl; |
| return 1; |
| } |
| catch( exception &error_ ) |
| { |
| cout << "Caught exception: " << error_.what() << endl; |
| return 1; |
| } |
| |
| if ( failures ) |
| { |
| cout << failures << " failures" << endl; |
| return 1; |
| } |
| |
| return 0; |
| } |
| |
| |