Qt QImage高质量绘图
时间:2009-07-22 来源:fewlife
by tangke <[email protected]> 2009-06-28
在进行绘图时,我们经常要面对速度和效率两者之间矛盾。在X11和MacOsX系统上,在QWidget和QPixmap绘图要依赖平台自身的绘图引擎。在X11上,与X server的通信很少,Qt只是发送绘图命令而不是真正的绘图数据。这种画法的不足是Qt要收到平台自身绘图引擎的限制。
在X11上,消除锯齿和支持分数坐标这些功能只有在Xserver上安装了XRender扩展才能实现;
在MacOsX平台,Qt自己的绘图引擎在绘制多段线时使用了和X11和Windows不同的算法,因此得到的结果会有稍许差别。
当准确性比效率重要时,我们可以先绘制在 QImage上,然后把结果拷贝到屏幕。在QImage绘图使用Qt自己的绘图引擎,因此在所有平台上都能得到一致的结果。使用这个方法的额外工作是用 QImage::Format_RGB32或者QImage::Format_ARGB32_Premutiplied参数创建QImage对象。
QImage::Format_ARGB32_Premutiplied 和传统的ARGB32格式(0xaarrggbb)格式完全一致,不同在于红,绿,蓝三个通道值都“乘以”了alpha通道值。这样,0x00到0xFF的 RGB颜色值范围变为0x00到alpha通道值。例如50%透明度的蓝色用ARGB格式表示为0x7F0000FF,在用 Format_ARGB32_Premutiplied表示时为0x7F00007F,同理,75%透明度的黑绿色在ARGB格式中表示为 0x3F008000,在Format_ARGB32_Premutiplied格式中表示为0x3F002000。
如果我们想用消除锯齿的方式绘制一个控件,并希望在没有XRender扩展的X11平台上也得到很好的结果,在原来需要依靠XRender的paintEvent()函数代码如下:
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
draw(&painter);
}
在进行绘图时,我们经常要面对速度和效率两者之间矛盾。在X11和MacOsX系统上,在QWidget和QPixmap绘图要依赖平台自身的绘图引擎。在X11上,与X server的通信很少,Qt只是发送绘图命令而不是真正的绘图数据。这种画法的不足是Qt要收到平台自身绘图引擎的限制。
在X11上,消除锯齿和支持分数坐标这些功能只有在Xserver上安装了XRender扩展才能实现;
在MacOsX平台,Qt自己的绘图引擎在绘制多段线时使用了和X11和Windows不同的算法,因此得到的结果会有稍许差别。
当准确性比效率重要时,我们可以先绘制在 QImage上,然后把结果拷贝到屏幕。在QImage绘图使用Qt自己的绘图引擎,因此在所有平台上都能得到一致的结果。使用这个方法的额外工作是用 QImage::Format_RGB32或者QImage::Format_ARGB32_Premutiplied参数创建QImage对象。
QImage::Format_ARGB32_Premutiplied 和传统的ARGB32格式(0xaarrggbb)格式完全一致,不同在于红,绿,蓝三个通道值都“乘以”了alpha通道值。这样,0x00到0xFF的 RGB颜色值范围变为0x00到alpha通道值。例如50%透明度的蓝色用ARGB格式表示为0x7F0000FF,在用 Format_ARGB32_Premutiplied表示时为0x7F00007F,同理,75%透明度的黑绿色在ARGB格式中表示为 0x3F008000,在Format_ARGB32_Premutiplied格式中表示为0x3F002000。
如果我们想用消除锯齿的方式绘制一个控件,并希望在没有XRender扩展的X11平台上也得到很好的结果,在原来需要依靠XRender的paintEvent()函数代码如下:
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
draw(&painter);
}
相关阅读 更多 +