wxWidgets的图像能力

这类支持还是相当的多的,


分在两个类里面: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,直到所有的项目编译成功。

上面提到的头文件,在编译的过程中,VC IDE会把它拷贝到


lib\vc_lib\mswd\wx

下面。所有的sample项目都需要这个头文件来进行配置。


这个时候,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)

那么是工程的link input中缺失

gdiplus.lib


只要在工程相关的地方把这个名字加入就可以。这个也说明了wxWidgets是架构在GDI+上的。

另外,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

你可能感兴趣的:(wxWidgets的图像能力)