查看完整版本: [-- 图像复制问题 --]

QTCN开发网 -> Qt基础编程 -> 图像复制问题 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

lieber 2019-10-14 09:36

图像复制问题

萌新昨天想用Qt画一组正弦条纹作为结构光的投影源,就是下面这样的。
[attachment=20921]
操作像素使每一行的灰度为正弦变化,用setPixel()方法已经实现,但是看到帮助文档里不推荐,就用了bits()方法。
思路是先写出来第一行,剩下的行直接复制第一行的数据。
无奈水平太差,写出来第一行就不知道怎么复制了,出来的图就是下面的样子,只显示了第一行在此求助大佬们给个解决方案
[attachment=20922]

最后附上辣鸡代码
QImage Widget::GeneratImg()
{    
    QElapsedTimer mstimer;
    QVector<QRgb>  colorTable;    
     for(int k=0;k<256;++k)    
    {        
        colorTable.push_back( qRgb(k,k,k) );    
    }    
    QImage tarimg(912,1140,QImage::Format_Indexed8);    
    tarimg.setColorTable(colorTable);
    uchar *pData = tarimg.bits();
    mstimer.start();  
    //写法1:setPixel()设置像素
//    for(int i=0;i<tarimg.height();i++)//逐行生成
//    {
//        for(int j=0;j<tarimg.width();j++)
//        {
//            tarimg.setPixel(j,i,uint((0.5+0.5*std::sin(2*3.14*0.125*j))*255));
//        }
//    }


    //写法2:采用bits()操作像素    
    for(int j=0;j<tarimg.width();j++)    
    {      
         *(pData+j*4) = uchar((0.5+0.5*std::sin(2*3.14*0.125*j))*255);      
         *(pData+j*4+1) = uchar((0.5+0.5*std::sin(2*3.14*0.125*j))*255);        
         *(pData+j*4+2) = uchar((0.5+0.5*std::sin(2*3.14*0.125*j))*255);    
    }    
    uchar *line0 = tarimg.scanLine(0);    
    for(int i=0;i<tarimg.height();i++)    
    {        
        uchar *tmp = tarimg.scanLine(i);        
        tmp = line0;    
    }
    double time=mstimer.nsecsElapsed() / 1000000;    qDebug()<<time<<"us";
    return tarimg;}



lieber 2019-10-14 10:07
不过话说回来,我没看出来两种方法效率有啥区别,都是几十微秒的事。。。。。

lgao622 2019-10-14 10:42
//写法2:采用bits()操作像素
    for(int j=0;j<tarimg.width();j++)
    {
         *(pData+j*4) = uchar((0.5+0.5*std::sin(2*3.14*0.125*j))*255);
         *(pData+j*4+1) = uchar((0.5+0.5*std::sin(2*3.14*0.125*j))*255);
         *(pData+j*4+2) = uchar((0.5+0.5*std::sin(2*3.14*0.125*j))*255);
    }
    uchar *line0 = tarimg.scanLine(0);
    for(int i=1;i<tarimg.height();i++)                         // 从i=1更好
    {
        uchar *tmp = tarimg.scanLine(i);
//        tmp = line0;
        memcpy(tmp, line0, tarimg.width());             // 数组拷贝赋值
    }

lieber 2019-10-14 11:16
lgao622://写法2:采用bits()操作像素
    for(int j=0;j<tarimg.width();j++)
    {
         *(pData+j*4) = uchar((0.5+0.5*std::sin(2*3.14*0.125*j))*255);
     &nbs .. (2019-10-14 10:42) 

666,不愧是大佬


查看完整版本: [-- 图像复制问题 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled