• 6433阅读
  • 2回复

已知每个像素的颜色,怎样画最快? [复制链接]

上一主题 下一主题
离线fire
 
只看楼主 倒序阅读 楼主  发表于: 2009-01-08
— 本帖被 XChinux 执行加亮操作(2009-01-14) —
学校图形学的Project,计算出所有像素的颜色后要把它们画在屏幕上
现在尝试了三种方法,在800*600的Widget上画,都是按for(y) for(x)的顺序(和屏幕扫描线方向一致),效率都不够理想:
1) 用QPainter(this)每个像素setPen(color)再drawPoint(x, y),平均每帧要400~500ms;
2) 先在同样大的QImage (Format_RGB32)里用setPixel()画好再QPainter.drawImage(),第一帧只要60ms,但之后每帧都要2000ms以上。试过了每帧都在同一个QImage上画和每帧都新建一个QImage画结果一样,不知道为什么后面的会那么慢(慢的是setPixel()的部分而不是drawImage());
3) 建一个同样大小的QPixmap,再对这个pixmap建QPainter,每个像素setPen()再drawPoint(),最后再QPainter(this).drawPixmap(),平均每帧要200~300ms。

时间是在VS2008的Release下测的,且都已经扣去了我计算像素颜色的时间

请问有没有更快的方法将已知的颜色画到屏幕上?

比如QImage有些构造函数是直接传入数据的,但是文档里并没有说那些数据的格式。如果可以将二维数组存的QRgb值快速转换过去运行

谢了
离线nmiirq

只看该作者 1楼 发表于: 2009-01-09
比如QImage有些构造函数是直接传入数据的,但是文档里并没有说那些数据的格式。如果可以将二维数组存的QRgb值快速转换过去运行

用这种方法,将算出来的数据存入数组,然后构造QImage,再刷出来,可以很快!
离线fanzhichao

只看该作者 2楼 发表于: 2009-01-09
这里假设所有像素的RGBA值按顺序写入1.dat,当然也可以是一块内存区域
QImage* image = new  QImage(800, 600, 32, 0, QImage::IgnoreEndian);
char* data = new char[600*4*800];
QFile file("1.dat");
file.open(IO_ReadWrite);
int i = file.readBlock((char*)(image->bits()), 600*4*800);
image->loadFromData((uchar*)data, 600*4*800);
上面一句才是关键,你只要把所有像素的RGBA的值一个接一个放入data即可
快速回复
限100 字节
 
上一个 下一个