这类支持还是相当的多的,
分在两个类里面:wxBitmap 和 wxImage。两者的关系是:wxImage更倾向于逻辑层的组织,可以有loadFile这样的方法来从磁盘读取图像文件。wxBitmap则是在绘制的时候需要用到的,dc只能通过这个来得到图像信息。这两者相辅相成,所以,wxBitmap::ConvertToImage()可以把一个bitmap转化成image,而wxBitmap有构造函数可以直接从一个wxImage构造出一个wxBitmap。
1、wxImage::InitAlpha()
这个方法能给没有alpha的image初始化出alpha通道出来,
2、wxImage::IsTransparent(int x, int y, unsigned char threhold = 128)
这个方法判断x,y处的像素是否是透明的。
3、wxImage::Rotate(angle, centerofpoint, interpolation)
让图片绕某个点旋转,第三个参数决定是用插值算法来给新的图像像素来赋值,还是直接用0。用0的话可以调试用,可以看到新的图像的框架。
非常需要注意的是,rotate后的图片,实际上是一个宽度和高度都大于等于原图的图片(仍然是矩形),rotate代码会在原图的基础上填充黑色作为填充色(如果有mask,则是mask颜色)。所以,如果要处理图像编辑软件,想实现让用户在原来的图片位置按中心旋转的效果,必须考虑实际上图片大小变化了,需要移动相应的距离来让用户感受到图像绕中心在旋转。这个偏移是:
(rotateWidth - originalWidth) / 2;
4、wxImage::SetAlpha (unsigned char *alpha = NULL,bool static_data = false)
这个可以给本来没有alpha通道的图像加上一个alpha通道,绘制的时候可以实现半透明效果。
类似方法:
void SetAlpha(int x, int y, unsigned char alpha)
这个是把某个像素对应的alpha设置成想要的。
5、wxMask
这个能跟wxBitmap一起作用,勾勒一个bitmap的非矩形部分。在3D中,相当于一个stencil。
用wxBitmap::SetMask()来使mask起作用。
6、Graphics Context
抗锯齿、alpha blend等。
进行编译的时候,需要做一些前期的设置:
以2.8.12为例
1, include\wx\msw\Setup.h #define wxUSE_GRAPHICS_CONTEXT 0 找到上面一句,把0改成1 2,编译整个wxWidgets,直到所有的项目编译成功。
lib\vc_lib\mswd\wx
这个时候,wxGCDC就被打开,并且可以用了。
注:
编译sample里面的项目的时候,如果碰到
Linking... 1>wxmsw28d_core.lib(corelib_renderer.obj) : error LNK2019: unresolved external symbol _GdipGetDC@8 referenced in function "public: struct HDC__ * __thiscall Gdiplus::Graphics::GetHDC(void)" (?GetHDC@Graphics@Gdiplus@@QAEPAUHDC__@@XZ) 1>wxmsw28d_core.lib(corelib_renderer.obj) : error LNK2019: unresolved external symbol _GdipReleaseDC@8 referenced in function "public: void __thiscall Gdiplus::Graphics::ReleaseHDC(struct HDC__ *)" (?ReleaseHDC@Graphics@Gdiplus@@QAEXPAUHDC__@@@Z) 1>wxmsw28d_core.lib(corelib_graphics.obj) : error LNK2019: unresolved external symbol _GdipFree@4 referenced in function "public: static void __cdecl Gdiplus::GdiplusBase::operator delete(void *)" (??3GdiplusBase@Gdiplus@@SAXPAX@Z) 1>wxmsw28d_core.lib(corelib_graphics.obj) : error LNK2019: unresolved external symbol _GdipDeletePen@4 referenced in function "public: __thiscall Gdiplus::Pen::~Pen(void)" (??1Pen@Gdiplus@@QAE@XZ) 1>wxmsw28d_core.lib(corelib_graphics.obj) : error LNK2019: unresolved external symbol _GdipAlloc@4 referenced in function "public: static void * __cdecl Gdiplus::GdiplusBase::operator new(unsigned int)" (??2GdiplusBase@Gdiplus@@SAPAXI@Z) 1>wxmsw28d_core.lib(corelib_graphics.obj) : error LNK2019: unresolved external symbol _GdipCreateTexture@12 referenced in function "public: __thiscall Gdiplus::TextureBrush::TextureBrush(class Gdiplus::Image *,enum Gdiplus::WrapMode)" (??0TextureBrush@Gdiplus@@QAE@PAVImage@1@W4WrapMode@1@@Z)
gdiplus.lib
另外,2.9.4中,Setup.h会根据编译器来自动打开这个宏,如果是7.1以上的VC,本身就是打开的,可以通过这个名字查一下。然后,这个文件并不拷贝到上面的那个目录了。sample中应该直接链接到这个目录来得到这个头文件。
测试的结果是,alpha blend在windows上比DC慢很多的,因为架构在GDI+上,开了很多的选项(抗锯齿、差值等)。但是在mac上,但是很快。因为mac上是反的,DC只是GC的一层包装。
7, OpenGL
没错,你可以在wxWidgets中用到OpenGL。跟上面一样,编译wx的时候,打开一个OPENGL的选项,然后编译。sample中的cube、isosurf、penguin就是利用了openGL来画的。
8,Save file
恩。wxImage还提供了save的接口,配合SetOption(),可以把内存image保存为各种常见格式的文件。
9, DC.SetUserScale()
这个不是image或者bitmap的接口,但是放在这里特别说明。该方法用来对一个绘制的物体进行绘制的时候缩放,省去了内存分配,拷贝像素的时间。如果缩放的结果仅仅用来显示,就用这个对图像进行缩放,会快很多。
参考:
1、http://docs.wxwidgets.org/2.8/wx_wxbitmap.html#wxbitmap
2、http://docs.wxwidgets.org/2.8/wx_wximage.html
3、http://docs.wxwidgets.org/2.8/wx_wxmask.html
4、http://forums.wxwidgets.org/viewtopic.php?f=23&t=34275&start=0
5、http://forums.wxwidgets.org/viewtopic.php?p=134188
6、http://docs.wxwidgets.org/trunk/classwx_d_c.html