<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>ImageStone: ImageHandle_Gdiplus.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.1 -->
<div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Class Members</a></div>
<h1>ImageHandle_Gdiplus.h</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">/*</span>
00002 <span class="comment"> * Copyright (C) =USTC= Fu Li</span>
00003 <span class="comment"> *</span>
00004 <span class="comment"> * Author : Fu Li</span>
00005 <span class="comment"> * Create : 2004-6-18</span>
00006 <span class="comment"> * Home : http://www.crazy-bit.com/</span>
00007 <span class="comment"> * Mail : crazybit@263.net</span>
00008 <span class="comment"> * History : </span>
00009 <span class="comment">*/</span>
00010 <span class="preprocessor">#ifndef __PCL_IMAGE_HANDLE_GDIPLUS__2004_06_18__H__</span>
00011 <span class="preprocessor"></span><span class="preprocessor">#define __PCL_IMAGE_HANDLE_GDIPLUS__2004_06_18__H__</span>
00012 <span class="preprocessor"></span><span class="preprocessor">#include "ImageHandleBase.h"</span>
00013 <span class="preprocessor">#include "../oxo_helper.h"</span>
00014
00015 <span class="comment">//class FCImageHandle ;</span>
00016 <span class="keyword">class </span><a class="code" href="class_f_c_image_handle___gdiplus.html">FCImageHandle_Gdiplus</a> ;
00017
00018 <span class="comment">//=============================================================================</span>
<a name="l00022"></a><a class="code" href="class_f_c_image_handle___gdiplus.html">00022</a> <span class="comment"></span><span class="keyword">class </span><a class="code" href="class_f_c_image_handle___gdiplus.html">FCImageHandle_Gdiplus</a> : <span class="keyword">public</span> <a class="code" href="class_f_c_image_handle.html">FCImageHandle</a>
00023 {
00024 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_image_handle_base.html#a0">LoadImageFile</a> (<span class="keyword">const</span> <span class="keywordtype">char</span>* szFileName) ;
00025 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_image_handle_base.html#a1">LoadImageMemory</a> (<span class="keyword">const</span> BYTE* pStart, <span class="keywordtype">int</span> nFileSize) ;
00026 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_image_handle_base.html#a2">SaveImage</a> (<span class="keyword">const</span> <span class="keywordtype">char</span>* szFileName, <span class="keywordtype">int</span> nFlag = -1) ;
00027
00028 <span class="keywordtype">bool</span> __pcl_StoreGdiplusObject (<a class="code" href="class_f_c_image_handle.html">FCImageHandle</a>* pHandler, Gdiplus::Bitmap* gp_Bmp) ;
00029 <span class="keywordtype">bool</span> __pcl_GetEncoderClsid (<span class="keyword">const</span> WCHAR* szFormat, CLSID* pClsid) ;
00030 <span class="keyword">public</span>:
00031 <a class="code" href="class_f_c_image_handle___gdiplus.html">FCImageHandle_Gdiplus</a>()
00032 {
00033 Gdiplus::GdiplusStartupInput gpStartupInput ;
00034 Gdiplus::GdiplusStartup (&m_GdiplusToken, &gpStartupInput, NULL) ;
00035 }
00036 <span class="keyword">virtual</span> ~<a class="code" href="class_f_c_image_handle___gdiplus.html">FCImageHandle_Gdiplus</a>()
00037 {
00038 Gdiplus::GdiplusShutdown (m_GdiplusToken) ;
00039 }
00040 <span class="keyword">private</span>:
00041 ULONG_PTR m_GdiplusToken ;
00042 } ;
00043
00044 <span class="comment">//=============================================================================</span>
00045 <span class="comment">// inline Implement</span>
00046 <span class="comment">//=============================================================================</span>
00047 <span class="keyword">inline</span> <span class="keywordtype">bool</span> FCImageHandle_Gdiplus::__pcl_StoreGdiplusObject (<a class="code" href="class_f_c_image_handle.html">FCImageHandle</a>* pHandler, Gdiplus::Bitmap* gp_Bmp)
00048 {
00049 <span class="keywordflow">if</span> (!gp_Bmp || (gp_Bmp->GetLastStatus() != Gdiplus::Ok))
00050 {
00051 assert(<span class="keyword">false</span>); <span class="keywordflow">return</span> <span class="keyword">false</span>;
00052 }
00053
00054 <span class="comment">// get image's info</span>
00055 BOOL bInitAlpha = FALSE ;
00056 BYTE __bufImgInfo[<span class="keyword">sizeof</span>(BITMAPINFOHEADER) + 16] = {0} ;
00057 BITMAPINFOHEADER * pInfo = (BITMAPINFOHEADER*)__bufImgInfo ;
00058 DWORD * pMask = (DWORD*)(pInfo + 1) ;
00059 pInfo->biWidth = gp_Bmp->GetWidth() ;
00060 pInfo->biHeight = gp_Bmp->GetHeight() ;
00061 pInfo->biCompression = BI_RGB ;
00062 <span class="keywordflow">switch</span> (gp_Bmp->GetPixelFormat())
00063 {
00064 <span class="keywordflow">case</span> PixelFormat1bppIndexed : pInfo->biBitCount = 1 ; break ;
00065 <span class="keywordflow">case</span> PixelFormat4bppIndexed : pInfo->biBitCount = 4 ; break ;
00066 <span class="keywordflow">case</span> PixelFormat8bppIndexed : pInfo->biBitCount = 8 ; break ;
00067 <span class="keywordflow">case</span> PixelFormat16bppRGB555 :
00068 <span class="keywordflow">case</span> PixelFormat16bppARGB1555 :
00069 pInfo->biBitCount = 16 ;
00070 pInfo->biCompression = BI_BITFIELDS ;
00071 pMask[0] = MASK16_RED_555 ;
00072 pMask[1] = MASK16_GREEN_555 ;
00073 pMask[2] = MASK16_BLUE_555 ;
00074 break ;
00075 <span class="keywordflow">case</span> PixelFormat16bppRGB565 :
00076 pInfo->biBitCount = 16 ;
00077 pInfo->biCompression = BI_BITFIELDS ;
00078 pMask[0] = MASK16_RED_565 ;
00079 pMask[1] = MASK16_GREEN_565 ;
00080 pMask[2] = MASK16_BLUE_565 ;
00081 break ;
00082 <span class="keywordflow">case</span> PixelFormat32bppRGB :
00083 pInfo->biBitCount = 32 ; <span class="comment">// no alpha channel, fill 0xFF</span>
00084 bInitAlpha = TRUE ;
00085 break ;
00086 <span class="keywordflow">case</span> PixelFormat24bppRGB : pInfo->biBitCount = 24 ; break ;
00087 <span class="keywordflow">case</span> PixelFormat32bppPARGB :
00088 <span class="keywordflow">case</span> PixelFormat32bppARGB : pInfo->biBitCount = 32 ; break ;
00089 <span class="keywordflow">default</span> :
00090 <span class="keywordflow">return</span> false ;
00091 }
00092
00093 <span class="comment">// create image</span>
00094 <a class="code" href="class_f_c_obj_image.html">FCObjImage</a> * pImg = <span class="keyword">new</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a> ;
00095 <span class="keywordflow">if</span> (!pImg-><a class="code" href="class_f_c_obj_image.html#z27_0">Create</a>(pInfo))
00096 {
00097 <span class="keyword">delete</span> pImg; <span class="keywordflow">return</span> false ;
00098 }
00099
00100 <span class="comment">// set palette</span>
00101 <span class="keywordflow">if</span> (pImg-><a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() <= 8)
00102 {
00103 <span class="keyword">const</span> <span class="keywordtype">int</span> nPalSize = gp_Bmp->GetPaletteSize() ;
00104 <a class="code" href="class_p_c_l__array.html">PCL_array<Gdiplus::ColorPalette></a> pPal (<span class="keyword">new</span> BYTE[nPalSize]) ;
00105 gp_Bmp->GetPalette (pPal.get(), nPalSize) ;
00106 pImg-><a class="code" href="class_f_c_obj_image.html#z33_1">SetColorTable</a> (0, pPal.get()->Count, (RGBQUAD*)&pPal.get()->Entries[0]) ;
00107 }
00108
00109 <span class="comment">// set pixel</span>
00110 Gdiplus::Rect rcLock (0, 0, pImg-><a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>(), pImg-><a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()) ;
00111 Gdiplus::BitmapData BmpData ;
00112
00113 <span class="preprocessor"> #if _MSC_VER > 1200 // VC7</span>
00114 <span class="preprocessor"></span> gp_Bmp->LockBits (&rcLock, Gdiplus::ImageLockModeRead, gp_Bmp->GetPixelFormat(), &BmpData) ;
00115 <span class="preprocessor"> #else</span>
00116 <span class="preprocessor"></span> gp_Bmp->LockBits (rcLock, Gdiplus::ImageLockModeRead, gp_Bmp->GetPixelFormat(), &BmpData) ;
00117 <span class="preprocessor"> #endif</span>
00118 <span class="preprocessor"></span>
00119 <span class="keyword">const</span> BYTE * pixels = (BYTE*)BmpData.Scan0 ;
00120 <span class="keyword">const</span> <span class="keywordtype">int</span> nPitch = FMin (pImg-><a class="code" href="class_f_c_obj_image.html#z29_7">GetPitch</a>(), BmpData.Stride) ;
00121 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0 ; y < pImg-><a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; y++)
00122 {
00123 CopyMemory (pImg-><a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a>(y), &pixels[y * BmpData.Stride], nPitch) ;
00124 }
00125 gp_Bmp->UnlockBits (&BmpData) ;
00126
00127 <span class="comment">// over</span>
00128 <span class="keywordflow">if</span> (bInitAlpha)
00129 pImg->SetAlphaChannelValue(0xFF) ;
00130 pHandler->PCL_PushObject (pImg) ; <span class="comment">// pImg's ownership</span>
00131 return true ;
00132 }
00133 <span class="comment">//-----------------------------------------------------------------------------</span>
00134 inline <span class="keywordtype">bool</span> <a class="code" href="class_f_c_image_handle___gdiplus.html">FCImageHandle_Gdiplus</a>::LoadImageFile (const <span class="keywordtype">char</span>* szFileName)
00135 {
00136 <span class="comment">// load image file</span>
00137 <span class="keywordtype">bool</span> bRet = false ;
00138 Gdiplus::Bitmap * gp_Bmp = Gdiplus::Bitmap::FromFile(_bstr_t(szFileName)) ; <span class="comment">// ASCII --> UNICODE</span>
00139 <span class="keywordflow">if</span> (gp_Bmp)
00140 {
00141 bRet = __pcl_StoreGdiplusObject (<span class="keyword">this</span>, gp_Bmp) ;
00142 <span class="keyword">delete</span> gp_Bmp ;
00143 }
00144 <span class="keywordflow">return</span> bRet ;
00145 }
00146 <span class="comment">//-----------------------------------------------------------------------------</span>
00147 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_image_handle_base.html#a1">FCImageHandle_Gdiplus::LoadImageMemory</a> (<span class="keyword">const</span> BYTE* pStart, <span class="keywordtype">int</span> nFileSize)
00148 {
00149 <span class="keywordflow">if</span> (!pStart || (nFileSize <= 0))
00150 {
00151 assert(<span class="keyword">false</span>); <span class="keywordflow">return</span> <span class="keyword">false</span>;
00152 }
00153
00154 <span class="keywordtype">bool</span> bRet = false ;
00155 HGLOBAL hBuffer = ::GlobalAlloc (GMEM_MOVEABLE, nFileSize) ;
00156
00157 <span class="comment">// copy to HGLOBAL then load</span>
00158 ::CopyMemory (::GlobalLock(hBuffer), pStart, nFileSize) ;
00159 ::GlobalUnlock (hBuffer) ;
00160
00161 IStream * pStream = NULL ;
00162 <span class="keywordflow">if</span> (::CreateStreamOnHGlobal (hBuffer, TRUE, &pStream) == S_OK)
00163 {
00164 Gdiplus::Bitmap * gp_Bmp = Gdiplus::Bitmap::FromStream(pStream) ;
00165 <span class="keywordflow">if</span> (gp_Bmp)
00166 {
00167 bRet = __pcl_StoreGdiplusObject (<span class="keyword">this</span>, gp_Bmp) ;
00168 <span class="keyword">delete</span> gp_Bmp ;
00169 }
00170 pStream->Release() ;
00171 }
00172 <span class="keywordflow">return</span> bRet ;
00173 }
00174 <span class="comment">//-----------------------------------------------------------------------------</span>
00175 <span class="keyword">inline</span> <span class="keywordtype">bool</span> FCImageHandle_Gdiplus::__pcl_GetEncoderClsid (<span class="keyword">const</span> WCHAR* szFormat, CLSID* pClsid)
00176 {
00177 UINT nNum=0, nSize=0 ;
00178 Gdiplus::GetImageEncodersSize (&nNum, &nSize) ;
00179 <span class="keywordflow">if</span> (nSize <= 0)
00180 return false ;
00181
00182 <a class="code" href="class_p_c_l__array.html">PCL_array</a><Gdiplus::ImageCodecInfo> pICI (new BYTE[nSize]) ;
00183 Gdiplus::GetImageEncoders (nNum, nSize, pICI.get()) ;
00184
00185 for (UINT i=0 ; i < nNum; i++)
00186 {
00187 <span class="keywordflow">if</span> (wcscmp(pICI[i].MimeType, szFormat) == 0)
00188 {
00189 *pClsid = pICI[i].Clsid ;
00190 <span class="keywordflow">return</span> true ;
00191 }
00192 }
00193 <span class="keywordflow">return</span> false ;
00194 }
00195 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_image_handle_base.html#a2">FCImageHandle_Gdiplus::SaveImage</a> (<span class="keyword">const</span> <span class="keywordtype">char</span>* szFileName, <span class="keywordtype">int</span> nFlag)
00196 {
00197 <span class="keywordflow">if</span> (<a class="code" href="class_f_c_image_handle_base.html#p0">m_SaveImg</a>.empty() || !<a class="code" href="class_f_c_image_handle_base.html#p0">m_SaveImg</a>[0]->IsValidImage())
00198 <span class="keywordflow">return</span> false ;
00199 <span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a> &img = *<a class="code" href="class_f_c_image_handle_base.html#p0">m_SaveImg</a>[0] ;
00200
00201 <span class="comment">// get encoder's CLSID</span>
00202 CLSID imgClsid ;
00203 bstr_t strType ;
00204 <span class="keywordflow">switch</span> (FCOXOHelper::GetImageTypeFromName(szFileName))
00205 {
00206 <span class="keywordflow">case</span> IMG_BMP : strType = <span class="stringliteral">"image/bmp"</span> ; <span class="keywordflow">break</span>;
00207 <span class="keywordflow">case</span> IMG_JPG : strType = <span class="stringliteral">"image/jpeg"</span> ; <span class="keywordflow">break</span>;
00208 <span class="keywordflow">case</span> IMG_GIF : strType = <span class="stringliteral">"image/gif"</span> ; <span class="keywordflow">break</span>;
00209 <span class="keywordflow">case</span> IMG_TIF : strType = <span class="stringliteral">"image/tiff"</span> ; <span class="keywordflow">break</span>;
00210 <span class="keywordflow">case</span> IMG_PNG : strType = <span class="stringliteral">"image/png"</span> ; <span class="keywordflow">break</span>;
00211 <span class="keywordflow">default</span> : <span class="keywordflow">return</span> false ;
00212 }
00213 __pcl_GetEncoderClsid (strType, &imgClsid) ;
00214
00215 <span class="comment">// create a GDI+ bitmap to save</span>
00216 <a class="code" href="class_p_c_l__array.html">PCL_array<BITMAPINFO></a> bmfh (img.<a class="code" href="class_f_c_obj_image.html#z29_8">NewImgInfoWithPalette</a>()) ;
00217 Gdiplus::Bitmap gpBmp (bmfh.get(), img.<a class="code" href="class_f_c_obj_image.html#z29_3">GetMemStart</a>()) ;
00218 <span class="keywordflow">return</span> (gpBmp.Save (bstr_t(szFileName), &imgClsid, NULL) == Gdiplus::Ok) ;
00219 }
00220
00221 <span class="preprocessor">#endif</span>
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Wed Mar 8 11:12:46 2006 for ImageStone by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.1 </small></address>
</body>
</html>