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

图片显示

开发平台:

Visual C++

  1. /*
  2.  * File: wbimage.cc
  3.  * Purpose: Platform Independent Image Base Class (Windows version)
  4.  * Author: Alejandro Aguilar Sierra
  5.  * Created: 1995
  6.  * Copyright: (c) 1995 Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
  7.  */
  8. #include "imabmp.h"
  9. #if CIMAGE_SUPPORT_BMP
  10. #include "dibutils.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. CImageBMP::CImageBMP( const CBitmap* bmp)
  17. {
  18.   bgindex = -1;
  19.   lpbi = 0;
  20.   RawImage = 0;
  21.   imagePalette = 0;
  22.   if (bmp) {
  23.          
  24.       BITMAP bm;
  25.   HBITMAP hBitmap = (HBITMAP)(bmp->GetSafeHandle());
  26.       GetObject(hBitmap, sizeof(BITMAP), (LPSTR) &bm);
  27.       int width = bm.bmWidth;
  28.       int height = bm.bmHeight;
  29. //      int depth = bm.bmPlanes;
  30.   int depth = bm.bmBitsPixel;
  31.       Create(width, height, depth);
  32.       HDC dc = ::GetDC(NULL);
  33.       if (GetDIBits(dc, hBitmap, 0, GetHeight(),
  34. RawImage, (LPBITMAPINFO)lpbi, DIB_RGB_COLORS) == 0)
  35.       {
  36.         TRACE0("GetDIBits failed");       
  37.       }
  38.       ::ReleaseDC(NULL, dc);
  39.   }
  40. }
  41. BOOL CImageBMP::ReadFile(const CString& imageFileName)
  42. {
  43.   if (imageFileName != "")
  44.  filename = imageFileName;
  45.   if (lpbi = DibOpenFile((char *)(const char *)filename))  {
  46. Width =  DibWidth(lpbi);
  47. Height = DibHeight(lpbi);
  48. Depth = DibBitCount(lpbi);
  49. RawImage = (ImagePointerType)DibPtr(lpbi);
  50. EffWidth = (long)(((long)Width*Depth + 31) / 32) * 4;
  51. HPALETTE palette;
  52. if (palette = MakePalette((const BITMAPINFO FAR*)lpbi, 0))
  53. {
  54.   imagePalette = new CImagePalette;
  55.   imagePalette->Attach(palette);
  56.   DibSetUsage(lpbi, (HPALETTE) (*imagePalette), CIMAGE_COLORS);
  57.   ColorType = (COLORTYPE_PALETTE | COLORTYPE_COLOR);
  58. return TRUE;
  59.   }
  60.   return FALSE;
  61. }
  62. BOOL CImageBMP::SaveFile(const CString& imageFileName)
  63. {                         
  64.   if (imageFileName != "")
  65.  filename = imageFileName;
  66.   HPALETTE hPal = 0;
  67.   if (imagePalette)
  68.     hPal = (HPALETTE) (*imagePalette);
  69.     
  70.   DibSetUsage(lpbi, hPal, DIB_RGB_COLORS);
  71. //  DibSetUsage(lpbi, hPal, DIB_PAL_COLORS);
  72.   return WriteDIB((const char *)imageFileName, lpbi);
  73. /*
  74. //  return WriteDIB(ImageFileName, HandleFromDib(lpbi));
  75.   // This was the original code used in wxImage, but the resulting
  76.   // file isn't a valid BMP file.
  77.   DibSetUsage(lpbi, (HPALETTE) (*imagePalette), DIB_RGB_COLORS);
  78.   if (!DibWriteFile((char *)(const char *)filename, lpbi))
  79. return FALSE;
  80. else return TRUE;
  81. */
  82. }
  83. #endif  // CIMAGE_SUPPORT_BMP