Rotate.cpp
上传用户:weiyeyoule
上传日期:2007-01-03
资源大小:21k
文件大小:5k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // Rotate.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include "Rotate.h"
  5. #include "RotateByShear.h"
  6. #include "dib.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. //
  13. // Sample implementation :
  14. // -----------------------
  15. // This implementation uses COLORREF for a pixel.
  16. // This implementation fits the DIB data structure.
  17. //
  18. class CRotateByShearRGB : public CRotateByShear<COLORREF>
  19. {
  20. public: 
  21.     CRotateByShearRGB (ProgressAnbAbortCallBack callback = NULL) : 
  22.         CRotateByShear<COLORREF> (callback) {}
  23.     virtual ~CRotateByShearRGB() {}
  24.     COLORREF GetRGB (COLORREF *pImage,      // Pointer to image
  25.                      SIZE  sImage,      // Size of image
  26.                      UINT  x,           // X coordinate
  27.                      UINT  y            // Y coordinate
  28.                     )
  29.     {
  30.         return pImage [x + y * sImage.cx];
  31.     }
  32.         // Set RGB value at given pixel coordinates
  33.     void SetRGB (COLORREF  *pImage,   // Pointer to image
  34.                  SIZE       sImage,   // Size of image
  35.                  UINT       x,        // X coordinate
  36.                  UINT       y,        // Y coordinate
  37.                  COLORREF   clr       // New color to set
  38.                 )
  39.     {
  40.         pImage [x + y * sImage.cx] = clr;
  41.     }
  42.         // Create a new bitmap, given a bitmap dimensions
  43.     COLORREF *CreateNewBitmap (SIZE  sImage) // Size of image
  44.     {
  45.         return new COLORREF [sImage.cx * sImage.cy];
  46.     }
  47.         // Create a new bitmap which is an identical copy of the source bitmap
  48.     COLORREF *CopyBitmap (COLORREF *pImage,     // Pointer to source image
  49.                           SIZE      sImage      // Size of source (and destination) image
  50.                          )
  51.     {
  52.         COLORREF *pDst =  CreateNewBitmap (sImage);
  53.         if (NULL != pDst)
  54.         {
  55.             memcpy (pDst, pImage, sizeof (COLORREF) * sImage.cx * sImage.cy);
  56.         }
  57.         return pDst;
  58.     }          
  59.         // Destroy a bitmap previously created in call to CreateNewBitmap(..)
  60.         // or to CopyBitmap (...)
  61.     void DestroyBitmap (COLORREF *pImage,   // Pointer to image
  62.                         SIZE                // Size of image
  63.                        )
  64.     {
  65.         delete [] pImage;
  66.     }
  67. };
  68.     
  69. /////////////////////////////////////////////////////////////////////////////
  70. // The one and only application object
  71. CWinApp theApp;
  72. using namespace std;
  73. BOOL Progress (BYTE bPercentComplete)
  74. {
  75.     printf ("%d percent completed...r", bPercentComplete);
  76.     return TRUE;
  77.     // If we return FALSE here, the rotation will be immediately aborted
  78. }
  79. void RotateFile (int argc, char *argv[])
  80. {
  81.     if (argc != 4)
  82.     {
  83.         printf ("Usage: Rotate <source file> <destination file> <roation angle>n"
  84.                 "e.g.: Rotate src.ppm dst.ppm 47.3n");
  85.         exit (1);
  86.     }
  87.     double dAngle = atof (argv[3]);
  88.     if (0.0 == dAngle)
  89.     {
  90.         printf ("Cannot parse rotation angle or roation angle is zero.n");
  91.         exit (1);
  92.     }
  93.     CDIB Src;
  94.     if (DIB_LOAD_OK != Src.Load (argv[1]))
  95.     {
  96.         printf ("Cannot read from source file %s.n", argv[1]);
  97.         exit (1);
  98.     }
  99.     SIZE sDst;
  100.     printf ("Attempting to rotate %s by %f degrees into %s.n", argv[1], dAngle, argv[2]);
  101.     CRotateByShearRGB Rot(Progress);
  102.     COLORREF *pDst = Rot.AllocAndRotate (
  103.                                         Src.m_Bits,
  104.                                         Src.m_Size,
  105.                                         dAngle,
  106.                                         &sDst,
  107.                                         RGB(0,0,0)
  108.                                     );
  109.     if (NULL == pDst)
  110.     {
  111.         printf ("Cannot allocate memory for operation.n");
  112.         exit (1);
  113.     }
  114.     {
  115.         CDIB Dst;
  116.         Dst.Create (sDst.cx, sDst.cy);
  117.         Dst.m_Bits = pDst;
  118.         if (DIB_SAVE_OK != Dst.SavePPM (argv[2]))
  119.         {
  120.             printf ("Cannot save rotated image to %s.n", argv[2]);
  121.             exit (1);
  122.         }
  123.     }
  124.     Rot.DestroyBitmap (pDst, sDst);
  125.     printf ("Success.n");
  126. }
  127. int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
  128. {
  129. int nRetCode = 0;
  130. // initialize MFC and print and error on failure
  131. if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
  132. {
  133. // TODO: change error code to suit your needs
  134. cerr << _T("Fatal Error: MFC initialization failed") << endl;
  135. nRetCode = 1;
  136. }
  137. else
  138. {
  139.         RotateFile (argc, argv);
  140. }
  141. return nRetCode;
  142. }