📄 stl.h
字号:
) { // Obtain first entry in MagickInfo list unsigned long number_formats; MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); char **coder_list = MagickLib::GetMagickList( "*", &number_formats, &exceptionInfo ); if( !coder_list ) { throwException( exceptionInfo ); throwExceptionExplicit(MagickLib::MissingDelegateError, "Coder array not returned!", 0 ); } // Clear out container container_->clear(); for ( int i=0; i < number_formats; i++) { const MagickLib::MagickInfo *magick_info = MagickLib::GetMagickInfo( coder_list[i], &exceptionInfo ); coder_list[i]=(char *) MagickLib::RelinquishMagickMemory( coder_list[i] ); // Skip stealth coders if ( magick_info->stealth ) continue; try { CoderInfo coderInfo( magick_info->name ); // Test isReadable_ if ( isReadable_ != CoderInfo::AnyMatch && (( coderInfo.isReadable() && isReadable_ != CoderInfo::TrueMatch ) || ( !coderInfo.isReadable() && isReadable_ != CoderInfo::FalseMatch )) ) continue; // Test isWritable_ if ( isWritable_ != CoderInfo::AnyMatch && (( coderInfo.isWritable() && isWritable_ != CoderInfo::TrueMatch ) || ( !coderInfo.isWritable() && isWritable_ != CoderInfo::FalseMatch )) ) continue; // Test isMultiFrame_ if ( isMultiFrame_ != CoderInfo::AnyMatch && (( coderInfo.isMultiFrame() && isMultiFrame_ != CoderInfo::TrueMatch ) || ( !coderInfo.isMultiFrame() && isMultiFrame_ != CoderInfo::FalseMatch )) ) continue; // Append matches to container container_->push_back( coderInfo ); } // Intentionally ignore missing module errors catch ( Magick::ErrorModule ) { continue; } } coder_list=(char **) MagickLib::RelinquishMagickMemory( coder_list ); MagickLib::DestroyExceptionInfo( &exceptionInfo ); } // // Fill container with color histogram. // Entries are of type "std::pair<Color,unsigned long>". Use the pair // "first" member to access the Color and the "second" member to access // the number of times the color occurs in the image. // // For example: // // Using <map>: // // Image image("image.miff"); // map<Color,unsigned long> histogram; // colorHistogram( &histogram, image ); // std::map<Color,unsigned long>::const_iterator p=histogram.begin(); // while (p != histogram.end()) // { // cout << setw(10) << (int)p->second << ": (" // << setw(quantum_width) << (int)p->first.redQuantum() << "," // << setw(quantum_width) << (int)p->first.greenQuantum() << "," // << setw(quantum_width) << (int)p->first.blueQuantum() << ")" // << endl; // p++; // } // // Using <vector>: // // Image image("image.miff"); // std::vector<std::pair<Color,unsigned long> > histogram; // colorHistogram( &histogram, image ); // std::vector<std::pair<Color,unsigned long> >::const_iterator p=histogram.begin(); // while (p != histogram.end()) // { // cout << setw(10) << (int)p->second << ": (" // << setw(quantum_width) << (int)p->first.redQuantum() << "," // << setw(quantum_width) << (int)p->first.greenQuantum() << "," // << setw(quantum_width) << (int)p->first.blueQuantum() << ")" // << endl; // p++; // } template <class Container > void colorHistogram( Container *histogram_, const Image image) { MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); // Obtain histogram array unsigned long colors; MagickLib::ColorPacket *histogram_array = MagickLib::GetImageHistogram( image.constImage(), &colors, &exceptionInfo ); throwException( exceptionInfo ); // Clear out container histogram_->clear(); // Transfer histogram array to container for ( unsigned long i=0; i < colors; i++) { histogram_->insert(histogram_->end(),std::pair<const Color,unsigned long> ( Color(histogram_array[i].pixel.red, histogram_array[i].pixel.green, histogram_array[i].pixel.blue), histogram_array[i].count) ); } // Deallocate histogram array histogram_array=(MagickLib::ColorPacket *) MagickLib::RelinquishMagickMemory(histogram_array); MagickLib::DestroyExceptionInfo( &exceptionInfo ); } // Break down an image sequence into constituent parts. This is // useful for creating GIF or MNG animation sequences. template <class InputIterator, class Container > void deconstructImages( Container *deconstructedImages_, InputIterator first_, InputIterator last_ ) { MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); // Build image list linkImages( first_, last_ ); MagickLib::Image* images = MagickLib::DeconstructImages( first_->image(), &exceptionInfo); // Unlink image list unlinkImages( first_, last_ ); // Ensure container is empty deconstructedImages_->clear(); // Move images to container insertImages( deconstructedImages_, images ); // Report any error throwException( exceptionInfo ); MagickLib::DestroyExceptionInfo( &exceptionInfo ); } // // Display an image sequence // template <class InputIterator> void displayImages( InputIterator first_, InputIterator last_ ) { MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); linkImages( first_, last_ ); MagickLib::DisplayImages( first_->imageInfo(), first_->image() ); MagickLib::GetImageException( first_->image(), &exceptionInfo ); unlinkImages( first_, last_ ); throwException( exceptionInfo ); MagickLib::DestroyExceptionInfo( &exceptionInfo ); } // Merge a sequence of image frames which represent image layers. // This is useful for combining Photoshop layers into a single image. template <class InputIterator> void flattenImages( Image *flattendImage_, InputIterator first_, InputIterator last_ ) { MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); linkImages( first_, last_ ); MagickLib::Image* image = MagickLib::FlattenImages( first_->image(), &exceptionInfo ); unlinkImages( first_, last_ ); flattendImage_->replaceImage( image ); throwException( exceptionInfo ); MagickLib::DestroyExceptionInfo( &exceptionInfo ); } // Replace the colors of a sequence of images with the closest color // from a reference image. // Set dither_ to true to enable dithering. Set measureError_ to // true in order to evaluate quantization error. template <class InputIterator> void mapImages( InputIterator first_, InputIterator last_, const Image& mapImage_, bool dither_ = false, bool measureError_ = false ) { MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); linkImages( first_, last_ ); MagickLib::MapImages( first_->image(), mapImage_.constImage(), dither_ ? MagickLib::MagickTrue : MagickLib::MagickFalse); MagickLib::GetImageException( first_->image(), &exceptionInfo ); if ( exceptionInfo.severity != MagickLib::UndefinedException ) { unlinkImages( first_, last_ ); throwException( exceptionInfo ); } MagickLib::Image* image = first_->image(); while( image ) { // Calculate quantization error if ( measureError_ ) { MagickLib::GetImageQuantizeError( image ); if ( image->exception.severity > MagickLib::UndefinedException ) { unlinkImages( first_, last_ ); throwException( exceptionInfo ); } } // Udate DirectClass representation of pixels MagickLib::SyncImage( image ); if ( image->exception.severity > MagickLib::UndefinedException ) { unlinkImages( first_, last_ ); throwException( exceptionInfo ); } // Next image image=image->next; } unlinkImages( first_, last_ ); MagickLib::DestroyExceptionInfo( &exceptionInfo ); } // Create a composite image by combining several separate images. template <class Container, class InputIterator> void montageImages( Container *montageImages_, InputIterator first_, InputIterator last_, const Montage &montageOpts_ ) { MagickLib::MontageInfo* montageInfo = static_cast<MagickLib::MontageInfo*>(MagickLib::AcquireMagickMemory(sizeof(MagickLib::MontageInfo))); // Update montage options with those set in montageOpts_ montageOpts_.updateMontageInfo( *montageInfo ); // Update options which must transfer to image options if ( montageOpts_.label().length() != 0 ) first_->label( montageOpts_.label() ); // Create linked image list linkImages( first_, last_ ); // Reset output container to pristine state montageImages_->clear(); // Do montage MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); MagickLib::Image *images = MagickLib::MontageImages( first_->image(), montageInfo, &exceptionInfo ); if ( images != 0 ) { insertImages( montageImages_, images ); } // Clean up any allocated data in montageInfo MagickLib::DestroyMontageInfo( montageInfo ); // Unlink linked image list unlinkImages( first_, last_ ); // Report any montage error throwException( exceptionInfo ); // Apply transparency to montage images if ( montageImages_->size() > 0 && montageOpts_.transparentColor().isValid() ) { for_each( first_, last_, transparentImage( montageOpts_.transparentColor() ) ); } // Report any transparentImage() error MagickLib::GetImageException( first_->image(), &exceptionInfo ); throwException( exceptionInfo ); MagickLib::DestroyExceptionInfo( &exceptionInfo ); } // Morph a set of images template <class InputIterator, class Container > void morphImages( Container *morphedImages_, InputIterator first_, InputIterator last_, unsigned int frames_ ) { MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); // Build image list linkImages( first_, last_ ); MagickLib::Image* images = MagickLib::MorphImages( first_->image(), frames_, &exceptionInfo); // Unlink image list unlinkImages( first_, last_ ); // Ensure container is empty morphedImages_->clear(); // Move images to container insertImages( morphedImages_, images ); // Report any error throwException( exceptionInfo ); MagickLib::DestroyExceptionInfo( &exceptionInfo ); } // Inlay a number of images to form a single coherent picture. template <class InputIterator> void mosaicImages( Image *mosaicImage_, InputIterator first_, InputIterator last_ ) { MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); linkImages( first_, last_ ); MagickLib::Image* image = MagickLib::MosaicImages( first_->image(), &exceptionInfo ); unlinkImages( first_, last_ ); mosaicImage_->replaceImage( image ); throwException( exceptionInfo ); MagickLib::DestroyExceptionInfo( &exceptionInfo ); } // Quantize colors in images using current quantization settings // Set measureError_ to true in order to measure quantization error template <class InputIterator> void quantizeImages( InputIterator first_, InputIterator last_, bool measureError_ = false ) { MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); linkImages( first_, last_ ); MagickLib::QuantizeImages( first_->quantizeInfo(), first_->image() ); MagickLib::GetImageException( first_->image(), &exceptionInfo ); if ( exceptionInfo.severity > MagickLib::UndefinedException ) { unlinkImages( first_, last_ ); throwException( exceptionInfo ); } MagickLib::Image* image = first_->image(); while( image != 0 ) { // Calculate quantization error if ( measureError_ ) MagickLib::GetImageQuantizeError( image ); // Update DirectClass representation of pixels MagickLib::SyncImage( image ); // Next image image=image->next; } unlinkImages( first_, last_ ); MagickLib::DestroyExceptionInfo( &exceptionInfo ); } // Read images into existing container (appending to container) // FIXME: need a way to specify options like size, depth, and density. template <class Container> void readImages( Container *sequence_, const std::string &imageSpec_ ) { MagickLib::ImageInfo *imageInfo = MagickLib::CloneImageInfo(0); imageSpec_.copy( imageInfo->filename, MaxTextExtent-1 ); imageInfo->filename[ imageSpec_.length() ] = 0; MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); MagickLib::Image* images = MagickLib::ReadImage( imageInfo, &exceptionInfo ); MagickLib::DestroyImageInfo(imageInfo); insertImages( sequence_, images); throwException( exceptionInfo ); MagickLib::DestroyExceptionInfo( &exceptionInfo ); } template <class Container> void readImages( Container *sequence_, const Blob &blob_ ) { MagickLib::ImageInfo *imageInfo = MagickLib::CloneImageInfo(0); MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); MagickLib::Image *images = MagickLib::BlobToImage( imageInfo, blob_.data(), blob_.length(), &exceptionInfo ); MagickLib::DestroyImageInfo(imageInfo); insertImages( sequence_, images ); throwException( exceptionInfo ); MagickLib::DestroyExceptionInfo( &exceptionInfo ); } // Write Images template <class InputIterator> void writeImages( InputIterator first_, InputIterator last_, const std::string &imageSpec_, bool adjoin_ = true ) { first_->adjoin( adjoin_ ); MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); linkImages( first_, last_ ); int errorStat = MagickLib::WriteImages( first_->constImageInfo(), first_->image(), imageSpec_.c_str(), &exceptionInfo ); unlinkImages( first_, last_ ); if ( errorStat != false ) return; throwException( exceptionInfo ); MagickLib::DestroyExceptionInfo( &exceptionInfo ); } // Write images to BLOB template <class InputIterator> void writeImages( InputIterator first_, InputIterator last_, Blob *blob_, bool adjoin_ = true) { first_->adjoin( adjoin_ ); linkImages( first_, last_ ); MagickLib::ExceptionInfo exceptionInfo; MagickLib::GetExceptionInfo( &exceptionInfo ); size_t length = 2048; // Efficient size for small images void* data = MagickLib::ImageToBlob( first_->imageInfo(), first_->image(), &length, &exceptionInfo); blob_->updateNoCopy( data, length, Magick::Blob::MallocAllocator ); unlinkImages( first_, last_ ); throwException( exceptionInfo ); MagickLib::DestroyExceptionInfo( &exceptionInfo ); }} // namespace Magick#endif // Magick_STL_header
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -