test_image.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_image.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:41:59  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_image.cpp,v 1000.2 2004/06/01 19:41:59 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *    Test app -- tests various aspects of image conversion and manipulation
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbiapp.hpp>
  41. #include <corelib/ncbiargs.hpp>
  42. #include <corelib/ncbienv.hpp>
  43. #include <corelib/ncbireg.hpp>
  44. #include <corelib/ncbitime.hpp>
  45. #include <util/image/image_io.hpp>
  46. USING_NCBI_SCOPE;
  47. class CImageTestApp : public CNcbiApplication
  48. {
  49. public:
  50.     virtual void Init(void);
  51.     virtual int  Run(void);
  52.     virtual void Exit(void);
  53. };
  54. /////////////////////////////////////////////////////////////////////////////
  55. //  Init test for all different types of arguments
  56. void CImageTestApp::Init(void)
  57. {
  58.     // Create command-line argument descriptions class
  59.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  60.     // Specify USAGE context
  61.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  62.                               "Image read/write test application");
  63.     arg_desc->AddDefaultKey("base", "ImageBase",
  64.                             "Base of image name",
  65.                             CArgDescriptions::eString, "test");
  66.     // Setup arg.descriptions for this application
  67.     SetupArgDescriptions(arg_desc.release());
  68. }
  69. int CImageTestApp::Run(void)
  70. {
  71.     CArgs args = GetArgs();
  72.     //
  73.     // test image conversions
  74.     //
  75.     string base = args["base"].AsString();
  76.     const int max_fmts = 8;
  77.     CImageIO::EType fmts[max_fmts] = {
  78.         CImageIO::eBmp,
  79.         CImageIO::eJpeg,
  80.         CImageIO::ePng,
  81.         CImageIO::eGif,
  82.         CImageIO::eSgi,
  83.         CImageIO::eTiff,
  84.         CImageIO::eXpm,
  85.         CImageIO::eRaw
  86.     };
  87.     const char* extensions[max_fmts] = {
  88.         ".bmp",
  89.         ".jpg",
  90.         ".png",
  91.         ".gif",
  92.         ".sgi",
  93.         ".tiff",
  94.         ".xpm",
  95.         ".raw"
  96.     };
  97.     vector<string> image_names;
  98.     for (int i = 0;  i < max_fmts;  ++i) {
  99.         image_names.push_back(base + extensions[i]);
  100.     }
  101.     cout << "testing image read/write..." << endl;
  102.     ITERATE (vector<string>, iter, image_names) {
  103.         cout << "image: " << *iter << endl;
  104.         CRef<CImage> image(CImageIO::ReadImage(*iter));
  105.         if ( !image ) {
  106.             continue;
  107.         }
  108.         cout << "  width = " << image->GetWidth()
  109.             << " height = " << image->GetHeight()
  110.             << " depth = " << image->GetDepth()
  111.             << endl;
  112.         image->SetDepth(3);
  113.         // write in a multitude of formats
  114.         for (int i = 0;  i < max_fmts;  ++i) {
  115.             string fname (*iter + extensions[i]);
  116.             cout << "trying to write: " << fname << endl;
  117.             if (CImageIO::WriteImage(*image, fname, fmts[i])) {
  118.                 cout << "wrote to file " << fname << endl;
  119.             }
  120.         }
  121.     }
  122.     //
  123.     // test image subsetting
  124.     //
  125.     cout << "testing image subsetting..." << endl;
  126.     ITERATE (vector<string>, iter, image_names) {
  127.         CRef<CImage> image(CImageIO::ReadImage(*iter));
  128.         if ( !image ) {
  129.             continue;
  130.         }
  131.         int width  = image->GetWidth() / 4;
  132.         int height = image->GetHeight() / 4;
  133.         int x      = image->GetWidth() / 3;
  134.         int y      = image->GetHeight() / 3;
  135.         CRef<CImage> subimage(image->GetSubImage(x, y, width, height));
  136.         subimage->SetDepth(4);
  137.         if (CImageIO::WriteImage(*subimage, *iter + ".sub-4.png",
  138.                                  CImageIO::ePng)) {
  139.             cout << "wrote subset (" << x << ", " << y << ", "
  140.                 << x+width << ", " << y+height << ") to file "
  141.                 << *iter + ".sub.png"
  142.                 << endl;
  143.         }
  144.         subimage->SetDepth(3);
  145.         if (CImageIO::WriteImage(*subimage, *iter + ".sub-3.jpg",
  146.                                  CImageIO::ePng)) {
  147.             cout << "wrote subset (" << x << ", " << y << ", "
  148.                 << x+width << ", " << y+height << ") to file "
  149.                 << *iter + ".sub.jpg"
  150.                 << endl;
  151.         }
  152.     }
  153.     //
  154.     // test ReadSubImage()
  155.     //
  156.     
  157.     cout << "testing ReadSubImage()..." << endl;
  158.     CRef<CImage> image(CImageIO::ReadImage(base + ".jpeg"));
  159.     if (image) {
  160.         int width  = image->GetWidth();
  161.         int height = image->GetHeight();
  162.         int x = width / 3;
  163.         int y = height / 3;
  164.         int w = width / 4;
  165.         int h = height / 4;
  166.         CStopWatch sw;
  167.         sw.Start();
  168.         CRef<CImage> subimage(CImageIO::ReadSubImage(base + ".jpg",
  169.                                                      x, y, w, h));
  170.         double e = sw.Elapsed();
  171.         cout << "done, read (" << x << ", " << y << ", " << x+w
  172.             << ", " << y+h << ") in " << e << "seconds" << endl;
  173.     }
  174.     return 0;
  175. }
  176. /////////////////////////////////////////////////////////////////////////////
  177. //  Cleanup
  178. void CImageTestApp::Exit(void)
  179. {
  180.     SetDiagStream(0);
  181. }
  182. /////////////////////////////////////////////////////////////////////////////
  183. //  MAIN
  184. int main(int argc, const char* argv[])
  185. {
  186.     // Execute main application function
  187.     return CImageTestApp().AppMain(argc, argv, 0, eDS_Default, 0);
  188. }
  189. /*
  190.  * ===========================================================================
  191.  * $Log: test_image.cpp,v $
  192.  * Revision 1000.2  2004/06/01 19:41:59  gouriano
  193.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  194.  *
  195.  * Revision 1.3  2004/05/17 21:08:10  gorelenk
  196.  * Added include of PCH ncbi_pch.hpp
  197.  *
  198.  * Revision 1.2  2003/12/16 15:49:38  dicuccio
  199.  * Large re-write of image handling.  Added improved error-handling and support
  200.  * for streams-based i/o (via hooks into each client library).
  201.  *
  202.  * Revision 1.1  2003/06/03 15:17:14  dicuccio
  203.  * Initial revision of image library
  204.  *
  205.  * ===========================================================================
  206.  */