• 1974阅读
  • 3回复

[提问]图像复制问题 [复制链接]

上一主题 下一主题
离线lieber
 

只看楼主 倒序阅读 楼主  发表于: 2019-10-14
萌新昨天想用Qt画一组正弦条纹作为结构光的投影源,就是下面这样的。

操作像素使每一行的灰度为正弦变化,用setPixel()方法已经实现,但是看到帮助文档里不推荐,就用了bits()方法。
思路是先写出来第一行,剩下的行直接复制第一行的数据
无奈水平太差,写出来第一行就不知道怎么复制了,出来的图就是下面的样子,只显示了第一行在此求助大佬们给个解决方案


最后附上辣鸡代码
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

只看该作者 1楼 发表于: 2019-10-14
不过话说回来,我没看出来两种方法效率有啥区别,都是几十微秒的事。。。。。
离线lgao622

只看该作者 2楼 发表于: 2019-10-14
//写法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());             // 数组拷贝赋值
    }
4条评分好评度+1贡献值+1金钱+10威望+1
lieber 好评度 +1 - 2019-10-14
lieber 贡献值 +1 - 2019-10-14
lieber 威望 +1 - 2019-10-14
lieber 金钱 +10 - 2019-10-14
为了胜利者的安宁,需要战败者的死亡。
Qt技术交流:QQ2499971906
离线lieber

只看该作者 3楼 发表于: 2019-10-14
回 lgao622 的帖子
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,不愧是大佬
快速回复
限100 字节
 
上一个 下一个