• 7747阅读
  • 3回复

[备份]实现从RGBA32格式的内存数据中初始化一个QImage[lsosa.BIT] [复制链接]

上一主题 下一主题
离线lsosa
 

只看楼主 倒序阅读 楼主  发表于: 2006-12-06
很多人都为如何将内存中某一个格式的数据如何转换成为图片数据显示到屏幕上犯愁,因为这是实现处理视频的一个关键部分,我曾经也是,所以深知其不容易,如今,我这里问题已经解决,所以将解决方法备份与此,仅供参考。
这里提供处理两种数据格式的方法,一种是处理RGB24格式,另一种是RGBA32格式;
说明:
内存中数据保存在pv_frame指针指向的内存空间中;
图象宽度为v_width, the height of it is v_height;(高度是v_height);下面展示方法调用;
RGB24:
/**
* lsosa.BIT
*/

int i;
int r, g, b;
QRgb *point;
uchar *bit;
QImage *pVideoImage = new QImage(width, height, 32);
setWFlags(getWFlags() | Qt::WRepaintNoErase);
// these codes should be optimized in future;
// high cpu taked here;
i = 0;
bit = (uchar *)(_frame);
for(int y = 0; y < v_height; y ++){
   for ( int x = 0; x < v_width; x ++ ){
       r = (int)bit;
       g = (int)bit[i+1];
       b = (int)bit[i+2];
       point = (QRgb *)pVideoImage->scanLine(y) + x;
       *point = qRgb(r, g, b);
       i += 3;
   }
}
bitBlt(this, 0, 0, pVideoImage);

the details is here:
http://www.qtcn.org/bbs/read.php?tid=3648&page=e&fpage=5
http://www.qtcn.org/bbs/read.php?tid=4990&page=e&fpage=1

RGBA32:
/**
* lsosa.BIT
*/
QImage *pv_images;
if ( pv_images == NULL ){
   QImage pv_images = new QImage((uchar *)pv_frame, \
       v_width, v_height, 32, NULL, 0, QImage::LittleEndian);
   if ( pv_images == NULL ){
       return -1;
   }
}

all is this...
离线lsosa

只看该作者 1楼 发表于: 2006-12-14
这里在补充一种方法,你可以使用QImage 的loadFromData方法从一段内存数据中加载图像,例如:
QImage *pf_video_image = new QImage();
pf_video_image->loadFromData(pf_videobuffer, frame_size);
如此应该也可以的;
代码是凭感觉写出来的,为经过测试哦。。。
离线liur
只看该作者 2楼 发表于: 2007-10-16
没测试就写出来实在是胆大~~

// 通过工具软件把一个 jpg 图片转换成 C 源码格式的内容.我使用 jpg 图片成功显示了.
// 转换之后,工具会告诉你这个 buf 的大小的.
//
long bufsize = 工具告诉你的大小;
char *photobuf[bufsize] = { 工具为你转换好的格式 };

QImage *img = new QImage();
img->loadFromData((uchar *)photobuf, bufsize);
QPixmap map;
map.convertFromImage(img);

QLabel *ctrl = new QLabel(this);
ctrl->setGeometry(.....);
ctrl->show();
ctrl->setPixmap(map);
离线liur
只看该作者 3楼 发表于: 2007-10-16
不过说起来 RGB24 和 RGBA32 怎么判断? 或者说使用 图片处理工具创建的 24位图是 RGB24 ,创建的  32位色的 jpg 图是 RGBA32 ?
快速回复
限100 字节
 
上一个 下一个