说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

ImageStone图像处理C++类库

HTML文档下载 WORD文档下载 PDF文档下载
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 pixelprintf ("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 qualityFCImageProperty   prop ;prop.SetPropertyValue (IMAGE_TAG_JPEG_QUALITY, "90") ;img.Save ("save.jpg", prop) ;

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

 

// Load image into memorychar   * 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 nameIMAGE_TYPE  t = FCObjImage::GetImageHandleFactory()->   QueryImageFileType("test.jpg");

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

 

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

Windows中从资源加载图像

 

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

通过FreeImage库加载/保存图像

 

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

结合ImageHandleFactory

 

// use FreeImage to load/save PSD/PCX imageclass 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 imageFCObjImage::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 speedstd::string   m = prop.QueryPropertyValue (IMAGE_TAG_EXIF_ISOSpeed) ;// get camera's equip modelstd::string   n = prop.QueryPropertyValue (IMAGE_TAG_EquipModel) ;

在Windows环境下绘制图像对象

 

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

复制/粘贴图像到剪切板

 

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

GDI HBITMAP和FCObjImage之间的转换

 

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

GDI+ 位图和FCObjImage之间的转换

 

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

图像处理

 

FCObjImage   img ;img.Load ("test.jpg") ; // resize (smooth) imageimg.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_PixelProcessFCPixelRotate   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 valueclass 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 classclass 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 processorFCObjImage   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 layerFCObjTextLayer   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 colorPOINT                 pt1={0,0}, pt2={0,50} ;FCPixelGradientLine   aCmd (pt1, pt2, PCL_RGBA(0,0,255),                            FCColor::crWhite()) ;imgT.SinglePixelProcessProc (aCmd) ; // blend text layer on imageRECT   rc = {0, 0, imgT.Width(), imgT.Height()} ;img.AlphaBlend (imgT, rc, rc, 100) ;

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

来自两位技术大牛的博弈:HBase或将制霸NoSQL? 应用改变世界 2013英特尔&#174;创新应用大赛火热开启 看13位CEO、创始人和高管如何提高工作效率 对首次购买智能手机用户而言,苹果吸引力并不大 Amazon Appstore面向Web应用开放 开发者可添加应用内付费功能 CSC收购成功转型的大数据初创公司InfoChimps 嘀嘀打车发展报告:成全球最大出租车调度平台 又摊上事儿了,Android的MasterKey再次出现bug 比特币挖矿必备工具 硬件性能大比拼 RDBMS vs. NoSQL:反派为什么会得以存活并发展壮大 帮助优化移动网站:谷歌发布新指南和PageSpeed Insights工具 增强Web可用性,你需要避免的七大设计错误 Python六大开源框架对比:Web2py略胜一筹 海外看中国:老外开发者间流传着的7件事儿 京东云峰:电商移动云平台背后的技术 初创公司DigitalOcean:55秒搭建一个云服务器 分布式系统事务原子性的非阻塞实现 IBM发布基于人脑特性设计的全新计算架构和编程语言 16款加速编码的HTML5在线工具 JFrog:开源项目的最大挑战是文档和许可 5个技巧打造完美用户体验,不到两年完成用户万到千万的增长 CDN未来的机遇和挑战 华为S12700全可编程交换机进一步挑战思科 OpenFient创始人:将平台创新进行到底 专访Ubisoft手游团队:“波斯王子”的时光机器 技术大牛Jiva DeVoe:App Store往事追忆录 移动周报:苹果iOS开发者中8位公认的“女神” Paul Graham:创业者如何说服投资人? 【CTO俱乐部深圳站】企业大数据建设案例分享 Gmail新设计影响邮件营销 Fcaebook间接获利 百度高德小米网易杭研讲师登场 SDCC 2013第二批议题发布(图) 怎样重载带参数的构造函数? 求救!我的程序在模拟器上可以运行,为什么程序在手机上安装是出错? 请问一个比较弱智的问题关于设置label控件的字体 Web Form中TextBox的问题。 pb可以动态生成控件吗? 高分求教一个数据库倒换问题---处理CLongBinary类型子段中的错误? 急急急,為何我這樣寫都會錯,真不明白。請高手們指點 bs的,研究不出来了 后台表单提交后,刷新前台数据,这个问题怎么解决!(高分求解) 急问有没有人用java写过ActiveX控件 快请大家帮忙,高分在先等待 请给提供一个大的免费邮箱!高分 有什么项目作? 请教:OnSize()中调用MoveWindow()出错、?? 想问一个问题 比我穷的人来拿分 唉~~~女朋友病了......送分求祝福 小问题: 程序运行后, 运行窗口在执行完程序后会自动关闭, 如何不让它自动关闭? 中太数据 VS Sun公司?该选哪个? 为何获取不了url中的Id值? orale 经典书籍征集!!! ASP , FTP 问题~~~~~~~~100分,不够可以加分,高手请进 PHP怎么设置SOCKET超时参数 大家加强点交流好吗?多沟通一点 初学者,串行化问题,谢谢帮忙 今天定下了我的人生目标 谁买了《游戏的设计与开发》这本书? redhat8.0+weblogic7.0(sp1) JSP配置问题 一个简单的问题 这就是我们的smoke小姐(恩不对不能确定性别)的“淑女”作风。。。嘿嘿 学习J2EE,谁能提供一套学习方案及相关书籍和资源 ASP高手来看看啊!!十万火急啊!!!!!!! IPCP数据疑问 Visual Basic宣告死亡了吗? 谁能帮小弟,解释ShellExecute参数的意思?? 怎样传送若干条信息?期待ing... 浮点数运算 内核编译后无法启动!!!!!急急急 我的数据表怎么会经常丢?? 谁能解决这个问题我叫他老大 传统C与ANSI C有何区别 新手提问!!! 组合框的问题 请推荐一些COM入门的书籍。 都来凑热闹来吧!谢! 50分求,有哪位做过ISDN(i4l),进来留个名字,急事!!! 局域网问题,不知简单或复杂,解决了100分相送! 有没有可以动态改变控件与控件之间宽度的控件 仙劍3 破落解文件下載,快下。快刪了。 保存bmp文件的时候,如何让保存对话框默认为.bmp?? 做程序员后最经常给自己找的借口、、、 Chinglish是什么意思? the company (which consists of) 15 small factories is facing a seriousfactories is facing a serious financial crisis 为什么用which 这里还可用 consisting of 是为什么 急 急··在线等 这句话怎么用英语写浅析微博对两会的作用这句话用英文怎么翻译 不要用翻译软件告诉我 我找了的 都不对 简要评价郑和船队的远航 请简要评价郑和船队的远航.简要!几句就够了! 根据材料一,指出郑和船队能够成功远航的条件有哪些? 这句话如何能用英语写得更好啊?What is more,higher tax revenue can also lead to the increase of crime rate.Because the increase of tax not only leaves more burden to the public,but also leaves a lot of private enterprises bankrupt.When pe Put Some Clothes On 歌词 put some color we've already talked about rising prices for fuel making container ships less profitable and eating into the margins for cheap products from the developing world.of course,energy-price hikes are one reason why supply chain manager are more nervous.bu ship是啥意思 粉丝自制任天堂智能手机惊现网络澳大利亚最老双胞胎长寿秘诀:不与坏男吉尔吉斯斯坦:探访美丽而濒危的猫科动日本茨城县一金属加工厂爆炸 两员工严美国19岁学生欲徒步闯南极 14岁曾澳大利亚最老双胞胎长寿秘诀:不与坏男促政府兑现修路承诺 小镇妇女性罢工拒沙特前高官批评美国中东政策 或联手埃美国北卡州狂欢活动发生意外事故 致5澳男子因涉嫌从15楼阳台扔下未婚妻出沙特前高官批评美中东政策 或联手埃及用纸艺激发最IN潮流,活出我的You纸张之上,握住旅行时间的尾巴让味蕾和美好悄然邂逅毕业游产品 抢早打响暑期市场争夺战香港美赞臣 京东新店上线彤人秘 旗舰店开幕COS 深秋画作蚂蚁短租推出 “免费毕业旅行计划”少女梦 在理想与现实之间过一个懒而美的夏天千年瑶寨力邀“白衣天使”免费游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘