CIMAGE.CPP
上传用户:wep9318
上传日期:2007-01-07
资源大小:893k
文件大小:5k
源码类别:

图片显示

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "cimage.h"
  5. #if CIMAGE_SUPPORT_JPEG
  6. #include "imajpg.h"
  7. #endif
  8. #if CIMAGE_SUPPORT_GIF
  9. #include "imagif.h"
  10. #endif
  11. #if CIMAGE_SUPPORT_PNG
  12. #include "imapng.h"
  13. #endif
  14. #if CIMAGE_SUPPORT_BMP
  15. #include "imabmp.h"
  16. #endif
  17. #ifdef _DEBUG
  18. #define new DEBUG_NEW
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22. struct FORMAT_LIST {
  23.   char *ext;
  24.   int Type;
  25. } Image_Format_List[] = {
  26. "BMP", CIMAGE_FORMAT_BMP,
  27. "GIF", CIMAGE_FORMAT_GIF,
  28. "JPG", CIMAGE_FORMAT_JPEG,
  29. "PNG", CIMAGE_FORMAT_PNG,
  30. "XPM", CIMAGE_FORMAT_XPM
  31. };
  32. char *GetExtension( char* FileName )
  33. {
  34.   char* p = &FileName[strlen(FileName)-1];
  35.   if (*p=='.') return 0;
  36.   for (int i=strlen(FileName); i > 0 && *(p-1)!='.'; i--) p--;
  37.   return p;
  38. }
  39. int search_formats(char *format)
  40. {
  41. int l = 0, r = CMAX_IMAGE_FORMATS, m, k;
  42. // printf("{%s}", format);
  43. while (l<r) {
  44.   m = (l+r)/2;
  45.   k = strcmpi(Image_Format_List[m].ext, format);
  46.   if (k==0)
  47.  return Image_Format_List[m].Type;
  48.   else
  49.  if (k<0) l = m+1; else r = m;
  50. }
  51. return -1;
  52. }
  53. // New implementation
  54. CImage::CImage(void)
  55. {
  56.   filename = "";
  57.   filetype = -1;
  58.   implementation = NULL;
  59. }
  60. CImage::CImage(const CBitmap *bitmap)
  61. {
  62.   filename = "";
  63.   filetype = CIMAGE_FORMAT_BMP;
  64.   implementation = new CImageBMP(bitmap);
  65. }
  66.  
  67. CImage::CImage(const CString& fileName, int imageType)
  68. {
  69. implementation = NULL;
  70. ReadFile(fileName, imageType);
  71. }
  72. CImage::CImage(const CImage *img)
  73. {
  74.   filename = ((CImage *)img)->GetFilename();
  75.   filetype = ((CImage *)img)->GetFileType();
  76.   switch (filetype)
  77.   {
  78. #if CIMAGE_SUPPORT_GIF
  79.     case CIMAGE_FORMAT_GIF:
  80.         implementation = new CImageGIF((const CImageGIF *)img->implementation);
  81.         break;
  82. #endif
  83. #if CIMAGE_SUPPORT_JPEG
  84.     case CIMAGE_FORMAT_JPEG:
  85.         implementation = new CImageJPG((const CImageJPG *)img->implementation);
  86.         break;
  87. #endif
  88. #if CIMAGE_SUPPORT_BMP
  89.     case CIMAGE_FORMAT_BMP:
  90.         implementation = new CImageBMP((const CImageBMP *)img->implementation);
  91.         break;
  92. #endif
  93. #if CIMAGE_SUPPORT_PNG
  94.     case CIMAGE_FORMAT_PNG:
  95.         implementation = new CImagePNG((const CImagePNG *)img->implementation);
  96.         break;
  97. #endif
  98.     default:
  99.         implementation = NULL;
  100.         break;
  101.   }
  102. }
  103.   
  104. CImage::~CImage()
  105. {
  106.   delete implementation;
  107. }
  108. BOOL CImage::ReadFile(const CString& fileName, int imageType)
  109. {
  110.         int oldImageType = filetype;
  111. filename = fileName;
  112. if (imageType==-1) {
  113.   imageType = search_formats(GetExtension((char *)(const char *)filename));
  114. }
  115.         filetype = imageType;
  116.         if (!implementation || (imageType != oldImageType))
  117.         {
  118.           if (!CreateImplementation(filename, imageType))
  119.             return FALSE;
  120.         }
  121.           
  122.         return implementation->ReadFile(filename);
  123. }
  124. BOOL CImage::SaveFile(const CString& fileName, int imageType)
  125. {
  126.         if (!implementation)
  127.           return FALSE;
  128.         int oldImageType = filetype;
  129. filename = fileName;
  130. if (imageType==-1) {
  131.   imageType = search_formats(GetExtension((char *)(const char *)filename));
  132. }
  133.         filetype = imageType;
  134.         
  135.         if (oldImageType == imageType)
  136.         {
  137.           // Don't need to create a new implementation
  138.         }
  139.         else
  140.         {
  141.             
  142.           CImageImpl *oldImage = implementation;
  143.           implementation = NULL;
  144.           if (!CreateImplementation(filename, imageType))
  145.           {
  146.             implementation = oldImage;
  147.             return FALSE;
  148.           }
  149.           
  150.           implementation->TransferBits(oldImage);
  151.           delete oldImage;
  152.         }
  153.           
  154.         return implementation->SaveFile(filename);
  155. }
  156. void CImage::Create(int width, int height, int deep, int colortype)
  157. {
  158.   if (!implementation)
  159.   {
  160.     int typ = CIMAGE_FORMAT_BMP;
  161.     CreateImplementation("", typ);
  162.     filetype = typ;
  163.     filename = "";
  164.   }
  165.     
  166.   implementation->Create(width, height, deep, colortype);
  167. }
  168. BOOL CImage::CreateImplementation(const CString& imageFileName, int& imageType)
  169. {
  170.   if (implementation)
  171.     delete implementation;
  172.   implementation = NULL;
  173.   
  174. switch (imageType) {
  175. #if CIMAGE_SUPPORT_PNG
  176. case CIMAGE_FORMAT_PNG:
  177. {
  178.   implementation = new CImagePNG(imageFileName);
  179.   break;
  180. }
  181. #endif
  182. #if CIMAGE_SUPPORT_JPEG
  183. case CIMAGE_FORMAT_JPEG:
  184. {
  185.   implementation = new CImageJPG(imageFileName);
  186.   break;
  187. }
  188. #endif
  189. #if CIMAGE_SUPPORT_BMP
  190. case CIMAGE_FORMAT_BMP:
  191. {
  192.   implementation =  new CImageBMP(imageFileName);
  193.   break;
  194. }
  195. #endif
  196. #if CIMAGE_SUPPORT_GIF
  197. case CIMAGE_FORMAT_GIF:
  198. {
  199.   implementation = new CImageGIF(imageFileName);
  200.   break;
  201. }
  202. #endif
  203. default:
  204. //   AfxMessageBox("Unrecognized CImage format");
  205.           return FALSE;
  206. }
  207. return TRUE;
  208. }
  209. CBitmap *CImage::MakeBitmap()
  210. {
  211.     CBitmap *newBitmap = new CBitmap;
  212.     newBitmap->CreateBitmap(GetWidth(), GetHeight(), 1, GetDepth(), NULL);
  213.     
  214.     CDC memDC;
  215.     memDC.CreateCompatibleDC(NULL);
  216.     CBitmap *oldBitmap = memDC.SelectObject(newBitmap);
  217.     CPalette *oldPalette = NULL;
  218.     if (GetPalette())
  219.     {
  220.       oldPalette = memDC.SelectPalette(GetPalette(), FALSE);
  221.     }
  222.     Draw(&memDC);
  223.     memDC.SelectObject(oldBitmap);
  224.     memDC.SelectPalette(oldPalette, FALSE);
  225.     
  226.     return newBitmap;
  227. }