Click here to Skip to main content
15,867,756 members
Articles / Desktop Programming / MFC

ImageStone - A Powerful C++ Class Library for Image Manipulation

Rate me:
Please Sign up or sign in to vote.
4.81/5 (250 votes)
6 Dec 2011Zlib3 min read 115.1K   51.5K   405  
An article on a library for image manipulation
<!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&nbsp;Page</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Class&nbsp;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 (&amp;m_GdiplusToken, &amp;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-&gt;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-&gt;biWidth = gp_Bmp-&gt;GetWidth() ;
00060     pInfo-&gt;biHeight = gp_Bmp-&gt;GetHeight() ;
00061     pInfo-&gt;biCompression = BI_RGB ;
00062     <span class="keywordflow">switch</span> (gp_Bmp-&gt;GetPixelFormat())
00063     {
00064         <span class="keywordflow">case</span> PixelFormat1bppIndexed : pInfo-&gt;biBitCount = 1 ; break ;
00065         <span class="keywordflow">case</span> PixelFormat4bppIndexed : pInfo-&gt;biBitCount = 4 ; break ;
00066         <span class="keywordflow">case</span> PixelFormat8bppIndexed : pInfo-&gt;biBitCount = 8 ; break ;
00067         <span class="keywordflow">case</span> PixelFormat16bppRGB555 :
00068         <span class="keywordflow">case</span> PixelFormat16bppARGB1555 :
00069             pInfo-&gt;biBitCount = 16 ;
00070             pInfo-&gt;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-&gt;biBitCount = 16 ;
00077             pInfo-&gt;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-&gt;biBitCount = 32 ; <span class="comment">// no alpha channel, fill 0xFF</span>
00084             bInitAlpha = TRUE ;
00085             break ;
00086         <span class="keywordflow">case</span> PixelFormat24bppRGB : pInfo-&gt;biBitCount = 24 ; break ;
00087         <span class="keywordflow">case</span> PixelFormat32bppPARGB :
00088         <span class="keywordflow">case</span> PixelFormat32bppARGB : pInfo-&gt;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-&gt;<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-&gt;<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &lt;= 8)
00102     {
00103         <span class="keyword">const</span> <span class="keywordtype">int</span>     nPalSize = gp_Bmp-&gt;GetPaletteSize() ;
00104         <a class="code" href="class_p_c_l__array.html">PCL_array&lt;Gdiplus::ColorPalette&gt;</a>   pPal (<span class="keyword">new</span> BYTE[nPalSize]) ;
00105         gp_Bmp-&gt;GetPalette (pPal.get(), nPalSize) ;
00106         pImg-&gt;<a class="code" href="class_f_c_obj_image.html#z33_1">SetColorTable</a> (0, pPal.get()-&gt;Count, (RGBQUAD*)&amp;pPal.get()-&gt;Entries[0]) ;
00107     }
00108 
00109     <span class="comment">// set pixel</span>
00110     Gdiplus::Rect         rcLock (0, 0, pImg-&gt;<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>(), pImg-&gt;<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 &gt; 1200 // VC7</span>
00114 <span class="preprocessor"></span>        gp_Bmp-&gt;LockBits (&amp;rcLock, Gdiplus::ImageLockModeRead, gp_Bmp-&gt;GetPixelFormat(), &amp;BmpData) ;
00115 <span class="preprocessor">    #else</span>
00116 <span class="preprocessor"></span>        gp_Bmp-&gt;LockBits (rcLock, Gdiplus::ImageLockModeRead, gp_Bmp-&gt;GetPixelFormat(), &amp;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-&gt;<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 &lt; pImg-&gt;<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; y++)
00122     {
00123         CopyMemory (pImg-&gt;<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a>(y), &amp;pixels[y * BmpData.Stride], nPitch) ;
00124     }
00125     gp_Bmp-&gt;UnlockBits (&amp;BmpData) ;
00126 
00127     <span class="comment">// over</span>
00128     <span class="keywordflow">if</span> (bInitAlpha)
00129         pImg-&gt;SetAlphaChannelValue(0xFF) ;
00130     pHandler-&gt;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 --&gt; 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 &lt;= 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, &amp;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-&gt;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 (&amp;nNum, &amp;nSize) ;
00179     <span class="keywordflow">if</span> (nSize &lt;= 0)
00180         return false ;
00181 
00182     <a class="code" href="class_p_c_l__array.html">PCL_array</a>&lt;Gdiplus::ImageCodecInfo&gt;   pICI (new BYTE[nSize]) ;
00183     Gdiplus::GetImageEncoders (nNum, nSize, pICI.get()) ;
00184 
00185     for (UINT i=0 ; i &lt; 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]-&gt;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>   &amp;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, &amp;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&lt;BITMAPINFO&gt;</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), &amp;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&nbsp;
<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>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The zlib/libpng License


Written By
Team Leader PhoXo
China China
graduate from University of Science and Technology of China at 2002.

Now I work at www.phoxo.com.

Comments and Discussions