好库网 好库网首页 | 我的好库
VC开发指南

ImageStone图像处理C++类库

发布者:vchelp
发布日期:2012/5/23 20:11:07   更新日期:2012/5/23 20:11:07
阅读次数:6835
评分:4.80
介绍:ImageStone是一个功能强大的图像处理C++类库。它采用纯C++编写,接口简单。功能包括:加载、保存(JPG格式,BMP,GIF,PNG,TIFF,ICO图标,TGA,PCX,PSD)、显示,直方图,撤销(undo)/重做(redo),超过100个图像特效。
正文:


作者:crazybit

 

介绍

ImageStone是一个功能强大的图像处理C++类库。它采用纯C++编写,接口简单。功能包括:加载、保存(JPG格式,BMP,GIF,PNG,TIFF,ICO图标,TGA,PCX,PSD)、显示,直方图,撤销(undo)/重做(redo),超过100个图像特效。

 

许可

 

ImageStone是免费的。使用代码无论用在什么地方都行(商业的也可以),只要你不声称它是你自己的。(如果你将它用在你的产品中,我希望你能通知我。)

 

使用ImageStone

这是非常容易的。所有你需要做的就是在您的源代码的开头添加#include "ImageStone.h"。如果您使用的是一个MFC项目ImageStone,只需要在StdAfx.h里添加该行。

 

最基本和最重要的类是FCObjImage。了解如何使用它。

 

在任意操作系统中加载、保存图像文件

 

// for Windows : ImageStone uses GDI+ to load/save image,
//               Jpg/Png/Gif/Bmp/Tga/Tif be supported
// for Linux : Only Bmp/Tga are supported, but you can set
//             FreeImage handler to support more.
FCObjImage   img ;
img.Load ("test.jpg") ;
if (!img.IsValidImage())
{
   assert(false) ;
   return false ;
}
 
// print image's information : width, height, bit per pixel
printf ("image's width : %d",  img.Width()) ;
printf ("image's height : %d", img.Height()) ;
printf ("image's bpp : %d",    img.ColorBits()) ;
 
// Load/Save function determine image's format by file's ext name
// save image as jpeg file, its quality set 90 (ranges from 1 to 99)
img.Save ("save.jpg", 90) ;
img.Save ("save.png") ;
img.Save ("save.tif") ;
 
// Another way to set quality
FCImageProperty   prop ;
prop.SetPropertyValue (IMAGE_TAG_JPEG_QUALITY, "90") ;
img.Save ("save.jpg", prop) ;

在任意操作系统中从内存加载图像

 

// Load image into memory
char   * p = 0 ;
int    n = 0 ;
FCOXOHelper::LoadFileToBuffer ("test.jpg", p, n) ;
 
FCObjImage   img ;
img.Load (p, n, IMG_JPG) ;
 
delete[] p ;
 
// this line demonstrates how to determine the image's format by
// the file's ext name
IMAGE_TYPE  t = FCObjImage::GetImageHandleFactory()->
   QueryImageFileType("test.jpg");

在任意操作系统中从DIB流中加载图像

 

// Load image into memory
char   * p = 0 ;
int    n = 0 ;
FCOXOHelper::LoadFileToBuffer ("test.bmp", p, n) ;
p += sizeof(BITMAPFILEHEADER) ;
 
// now p points to a DIB stream
FCObjImage   img ;
img.LoadDIBStream (p, n) ;
 
delete[] p ;

Windows中从资源加载图像

 

// Load image from local exe file
FCObjImage   img ;
FCWin32::LoadImageRes (img, MAKEINTRESOURCE(nID), TEXT("JPG"),
                       IMG_JPG) ;
 
// Load image from DLL's resource
HMODULE   hDll = LoadLibrary (TEXT("ResDll.dll")) ;
FCWin32::LoadImageRes (img, MAKEINTRESOURCE(nID), TEXT("JPG"),
                       IMG_JPG, hDll) ;
 
// Load image from standard BITMAP resource
FCWin32::LoadImageBitmapRes (img, MAKEINTRESOURCE(nID));

通过FreeImage库加载/保存图像

 

// change to FreeImage library to load/save image
// for more detail, refer to example 005
FCObjImage::SetImageHandleFactory (new FCImageHandleFactory_FreeImage) ;
img.Load ("test.jpg") ;
 
// change to GDI+ load/save image
FCObjImage::SetImageHandleFactory (new FCImageHandleFactory_Gdiplus) ;
img.Load ("test.jpg") ;

结合ImageHandleFactory

 

// use FreeImage to load/save PSD/PCX image
class CMyImageFactory : public FCImageHandleFactory
{
protected:
   virtual FCImageHandleBase* CreateImageHandle (IMAGE_TYPE imgType)
   {
      switch (imgType)
      {
         case IMG_BMP : return new FCImageHandle_Bmp ;
         case IMG_TGA : return new FCImageHandle_Tga ;
         case IMG_JPG : return new FCImageHandle_Gdiplus ;
         case IMG_GIF : return new FCImageHandle_Gdiplus ;
         case IMG_TIF : return new FCImageHandle_Gdiplus ;
         case IMG_PNG : return new FCImageHandle_Gdiplus ;
         case IMG_PCX : return new FCImageHandle_FreeImage ;
         case IMG_PSD : return new FCImageHandle_FreeImage ;
      }
      return 0 ;
   }
   // protected avoid user delete object.
   virtual ~CMyImageFactory() {}
};
 
// use our custom factory to read/write image
FCObjImage::SetImageHandleFactory (new CMyImageFactory) ;
FCObjImage   img ;
img.Load ("test.jpg") ;

加载多帧GIF

 

FCObjMultiFrame   img ;
img.Load ("test.gif") ;
img.GetFrame(0)->Save ("001.jpg") ;
img.GetFrame(1)->Save ("001.jpg") ;

得到jpeg的EXIF信息

 

FCObjImage        img ;
FCImageProperty   prop ;
img.Load ("test.jpg", &prop) ;
 
// get camera's ISO speed
std::string   m = prop.QueryPropertyValue (IMAGE_TAG_EXIF_ISOSpeed) ;
// get camera's equip model
std::string   n = prop.QueryPropertyValue (IMAGE_TAG_EquipModel) ;

在Windows环境下绘制图像对象

 

FCObjImage   img ;
// capture current screen
RECT         rc = {0, 0, GetSystemMetrics(SM_CXSCREEN),
                         GetSystemMetrics(SM_CYSCREEN)} ;
FCWin32::CaptureScreen (img, rc) ;
 
// Draw image (no stretch) where top-left at (0,0) of hdc
FCWin32::DrawImage (img, hdc, 0, 0) ;
 
// Stretch image on region of hdc
RECT     rcOnDC = {100, 100, 200, 200} ;
FCWin32::DrawImage (img, hdc, rcOnDC) ;
 
// Stretch image on central of hdc's region and keep image's aspect
FCWin32::DrawImageAspect (img, hdc, rcOnDC) ;
 
// Stretch region of image on region of hdc
RECT     rcImg = {20, 20, 50, 50} ;
FCWin32::DrawImage (img, hdc, rcOnDC, rcImg) ;

复制/粘贴图像到剪切板

 

FCObjImage   img ;
img.Load ("test.jpg") ;
 
// copy image to Clipboard
FCWin32::CopyToClipboard (img) ;
 
// get image on Clipboard
FCWin32::GetClipboardImage (img) ;

GDI HBITMAP和FCObjImage之间的转换

 

// create HBITMAP from FCObjImage object
FCObjImage   img ;
img.Load ("test.jpg") ;
HBITMAP   h = FCWin32::CreateDDBHandle (img) ;
 
// create FCObjImage object from HBITMAP
FCWin32::CreateImageFromDDB (h, img) ;

GDI+ 位图和FCObjImage之间的转换

 

// create GDI+ Bitmap from FCObjImage object
FCObjImage   img ;
img.Load ("test.jpg") ;
Gdiplus::Bitmap   * pBmp = FCWin32::GDIPlus_CreateBitmap(img) ;
delete pBmp ;
 
// create FCObjImage object from GDI+ Bitmap
FCWin32::GDIPlus_LoadBitmap (*pBmp, img) ;

图像处理

 

FCObjImage   img ;
img.Load ("test.jpg") ;
 
// resize (smooth) image
img.Stretch (nWidth, nHeight) ;
img.Stretch_Smooth (nWidth, nHeight) ;
 
// Use SinglePixelProcessProc interface to process image.
// There are over 100 pre-implemented effects;
// please refer to class derived from FCInterface_PixelProcess
FCPixelRotate   aCmd (37) ;
img.SinglePixelProcessProc (aCmd) ;
 
FCPixelBrightness   aCmd (150) ;    // 150%
img.SinglePixelProcessProc (aCmd) ;
 
FCPixelMosaic   aCmd(5) ;
img.SinglePixelProcessProc (aCmd) ;
 
FCPixelOilPaint   aCmd (3) ;
img.SinglePixelProcessProc (aCmd) ;

自定义图像处理

 

// our processor : change pixel's RGB value
class CMyPixelProcessor : public FCSinglePixelProcessBase
{
public:
   CMyPixelProcessor (int nR, int nG, int nB) : m_R(nR), m_G(nG),
                                                m_B(nB) {}
private:
   virtual void ProcessPixel (FCObjImage* pImg, int x, int y,
                              BYTE* pPixel)
   {
      PCL_B(pPixel) = FClamp0255 (PCL_B(pPixel) + m_B) ;
      PCL_G(pPixel) = FClamp0255 (PCL_G(pPixel) + m_G) ;
      PCL_R(pPixel) = FClamp0255 (PCL_R(pPixel) + m_R) ;
   }
   int   m_R, m_G, m_B ;
};
 
// this class has the same function to upper class,
// but implements other class
class CMyImageProcessor : public FCPixelWholeImageBase
{
public:
   CMyPixelProcessor (int nR, int nG, int nB) : m_R(nR), m_G(nG),
                                                m_B(nB) {}
private:
   virtual void ProcessWholeImage (FCObjImage* pImg,
                                   FCObjProgress* pProgress)
   {
      for (int y=0 ; y < pImg->Height() ; y++)
      {
         for (int x=0 ; x < pImg->Width() ; x++)
         {
            BYTE   * p = pImg->GetBits(x,y) ;
            PCL_B(p)   = FClamp0255 (PCL_B(p) + m_B) ;
            PCL_G(p)   = FClamp0255 (PCL_G(p) + m_G) ;
            PCL_R(p)   = FClamp0255 (PCL_R(p) + m_R) ;
         }
         if (pProgress)
            pProgress->SetProgress (100 * y / pImg->Height()) ;
      }
   }
    int   m_R, m_G, m_B ;
};
 
// use our custom processor
FCObjImage   img ;
img.Load ("test.jpg") ;
 
CMyPixelProcessor   aCmd (20, 20, 20) ;
img.SinglePixelProcessProc (aCmd) ;
 
CMyImageProcessor   aCmd (20, 20, 20) ;
img.SinglePixelProcessProc (aCmd) ;

添加文字到图像

 

FCObjImage   img ;
img.Load ("c:\\test.jpg") ;
 
// now we create text layer
FCObjTextLayer   imgT ;
PACK_TextLayer   tp ;
tp.m_bAddShadow   = false ;
tp.m_bAntiAliased = true ;
tp.m_bBold        = true ;
tp.m_bItalic      = true ;
tp.m_crFont       = PCL_RGBA(0,0,255) ;
tp.m_nFontSize    = 128 ;
tp.m_strFace      = "Arial" ;
tp.m_strText      = "Hello" ;
FCWin32::CreateTextLayer_GDIPlus (imgT, tp) ;
 
// Now we have created a text image. Additionaly,
// we can add some affect to it, such as gradient color
POINT                 pt1={0,0}, pt2={0,50} ;
FCPixelGradientLine   aCmd (pt1, pt2, PCL_RGBA(0,0,255),
                            FCColor::crWhite()) ;
imgT.SinglePixelProcessProc (aCmd) ;
 
// blend text layer on image
RECT   rc = {0, 0, imgT.Width(), imgT.Height()} ;
img.AlphaBlend (imgT, rc, rc, 100) ;

下载源代码:http://www.okbase.net/file/item/2994


评论 [发表评论]
账号 密码 还没帐号呢,现在注册一个?

免责声明:好库网所展示的信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。好库网不提供任何保证,并不承担任何法律责任。