【问题标题】:XRender Display pictures from disk / application generated imagesXRender 显示来自磁盘/应用程序生成的图像的图片
【发布时间】:2013-04-22 11:46:47
【问题描述】:

我正在使用 GCC 在 Linux 上制作一个应用程序,其中一段时间​​以来我一直在使用 PngLIB 从磁盘加载我的图片。我从标准的 xlib 跳转到 Xrender 扩展,以便利用此扩展提供的抗锯齿和 alpha 通道属性。

但是,此扩展提供了一组简化的原语。例如,为了显示从磁盘加载的图片,我一直在使用 pnglib 加载它,然后调用 XRenderFillRectangle,宽度和高度为 1 个像素以及该像素所需的颜色。然而,随着我增加从磁盘加载的图标和图片的数量,很容易理解我很容易遇到对原始 XRenderFillRectangle 的数百万次调用。结论:目前,该应用程序需要大约 20 秒来渲染所有内容,甚至还不到我想要渲染的一半。

我很确定我使用的这种方法是完全错误的,必须有另一种方法!而且我也很确定这不是 Cairo 或 Java2D 生成内容的方式。

所以我的问题是:如何准备并放入由应用程序生成的 Xrender 图像的图片?例如,从磁盘加载的图像?

标准的 XPutImage 函数可以应用于 Xrender 的图片吗?我应该在生成图片之前将数据放入 Pixmap 吗?到目前为止,我的方法还没有奏效。

PS:请不要推荐我使用更丰富的库,例如 Cairo 或 Qt。我现在在这里提出这个问题,因为不幸的是,每次我找到有关这种情况的帖子时,大多数人的回答是:使用开罗。我真的需要在这个 X11 系统上保持尽可能低的水平。非常感谢。

【问题讨论】:

  • 您是否尝试使用site search
  • 您是否尝试阅读我的问题?我正在使用 Xrender 扩展,因此我不能将 XPutImage 应用于图片,只能应用于 PixMap。
  • 为什么不想用普通的xlib?
  • 因为普通的xlib不支持抗锯齿和alpha混合:)

标签: c++ linux x11 xlib


【解决方案1】:

XRenderCreatePicture 将像素图(或任何可绘制对象)作为参数。 为了使用 xrender 绘制像素,您需要:

  • 创建像素图
  • 使用 XPutImage 将图像数据传输到服务器
  • 创建与您的像素图关联的图片对象
  • 创建与您的窗口关联的图片对象
  • 使用 XRenderComposite 组合它们

请参阅 libXRender 文档here

使用node-x11的示例:

var x11 = require('x11');

var Exposure = x11.eventMask.Exposure;

var width = 300;
var height = 300;

var rgb = {
  data:new Buffer(width*height*4),
  width: width,
  height: height
};

var index;
for (var x = 0; x < rgb.width; ++x)
{
  for (var y = 0; y < rgb.height; ++y)
  {
    index = (x + y*rgb.width)*4;
    rgb.data[index] = parseInt(Math.sin(13*x/rgb.width)*255);
    rgb.data[index+1] = parseInt(Math.cos(15*y/rgb.height)*255);
    rgb.data[index+2] = parseInt(Math.cos(16*y/rgb.height)*255);
  }
}

x11.createClient(function(err, display)
{
  var X = display.client;
  X.require('render', function(Render) {
    var root = display.screen[0].root; 
    var win, picWin, pic, gc;

    win = X.AllocID();
    X.CreateWindow(
       win, root,
       0, 0, rgb.width, rgb.height,
       0, 0, 0, 0,
       { eventMask: Exposure }
    );
    X.MapWindow(win);

    gc = X.AllocID();
    X.CreateGC(gc, win);

    var rgbPixmap = X.AllocID();
    X.CreatePixmap(rgbPixmap, win, 24, rgb.width, rgb.height);
    X.PutImage(2, rgbPixmap, gc, rgb.width, rgb.height, 0, 0, 0, 24, rgb.data);

    var rgbPicture = X.AllocID();
    Render.CreatePicture(rgbPicture, rgbPixmap, Render.rgb24);
    var winPicture = X.AllocID();
    Render.CreatePicture(winPicture, win, Render.rgb24);

    X.on('event', function(ev) {
      if (ev.name == 'Expose')
        Render.Composite(3, rgbPicture, 0, winPicture, 0, 0, 0, 0, 0, 0, rgb.width, rgb.height);
    });
  });
});

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2017-08-23
  • 1970-01-01
  • 2021-01-01
  • 2011-06-08
  • 2011-02-04
  • 1970-01-01
相关资源
最近更新 更多