实现二维码轮廓的绘制和填充

时间:2024-05-22 15:37:17

最近刚在做一个项目,里面就需要用到二维码的轮廓的绘制以及填充的实现,当然在这个项目里面需要的是矢量填充。二维码的绘制在网上有很多的资源,源代码也不少,只需要下载一个库就可以了,实现起来也就几行代码的事情,在这里呢就不要过多的叙述二维码的库的下载和基本的绘制问题。下面是我的实现的图形,有这方面需要的朋友可以参考一下。

实现二维码轮廓的绘制和填充 实现二维码轮廓的绘制和填充

第一个图形是我实现的二维码轮廓的图形,第二个是实现矢量填充的。刚开始没有弄懂的时候还折腾了好就才想到了实现的方法,弄明白方法了其实也挺简单的。需要用到的话可以参考一下下面的代码,最近没有时间去优化了,目的主要是实现了就可以,所以如果谁有更好的方法的话,麻烦大家大家分享一下,我也顺便优化优化。

1.二维码的轮廓绘制代码

//判断是否绘制

 for(int row = 0;row < m_zintSymbol->rows;row++)        
{            
     int count = 0;            
     QList<QPointF> Point;            
     Point.clear();
    for (int i = 0; i < m_zintSymbol->width+1; i++) 
    {
      if (module_set(row, i)) 
      {                            
           int ed = module_set(row, i);                            
           int linewidth = 0;                            
          for (int j = i; j < m_zintSymbol->width; j++, linewidth++)                                
        if (ed != module_set(row, j))                                 
       break;                            
      if (!((i > main_width) && (row == m_zintSymbol->rows - 1)))
    { 

//判断下一个是否为绘制的矩形  没有则化右边的那一条直线   有就不需要绘制了
            if(!module_set(row,i+1))
    {
            int yy = m_zintSymbol->row_height[row];
            painter->drawLine(i + 1,y,i+1,y+yy);
    }

//同理  判断前一个矩形是否需要绘制  如果没有的话就绘制左边的那一条竖着的直线
             if(!module_set(row,i-1))
           {
                   int yy = m_zintSymbol->row_height[row];
                  painter->drawLine(i,y+yy,i,y);
           }

//判断下边一个是否有图形  没有则绘制下边一条直线
         if(!module_set(row+1,i))
       {
             int yy = m_zintSymbol->row_height[row];
             painter->drawLine(i,y+yy,i+1,y+yy);
       }

//判断上面是否有绘制图形  没有就绘制上面一条直线
       if(!module_set(row-1,i))
     {
           painter->drawLine(i,y,i+1,y);
      }
   }
}

}

}

绘制轮廓的核心代码大概就是这样的, 实现起来挺简单的,主要就按着绘制二维码的方法来,在绘制的时候增加判断会绘制。

2, 二维码填充线的绘制

 for(int row = 0;row < m_zintSymbol->rows;row++)       
 {           
       int count = 0;            
       QList<QPointF> Point;            
       Point.clear();
       for (int i = 0; i < m_zintSymbol->width+1; i++)
     {
         if(module_set(row,i))                 
        {                               
            if(!module_set(row,i+1))                                
           {                                    
               Point.append(QPointF(count,y));                                   
               Point.append(QPointF(i+1,y));                                   
               count = i+1;                               
           }                            
       }else {                                
           if(module_set(row,i+1))                                
          {                                    
              count = i + 1;                                
          }                            
     }

       }

      for(double k = 0; k < 1;k += 0.1)

    {

           for(int i = 0;i < Point.size();i += 2)

           {

                   painter->drawLine(QPointF(Point.at(i).x(),Point.at(i).y()+k)

                 ,QPointF(QPointF(Point.at(i+1).x(),Point.at(i).y()+k)));

          }

      }

}

这就是我实现的轮廓和填充图形的绘制的图形,如果有需要的朋友哪里看不懂的话,可以私聊我,大家一起学习。有更好的想法的朋友也希望给我分享一下,让我也学习一下。在这不胜感激。