實現二維碼輪廓的繪製和填充

最近剛在做一個項目,裏面就需要用到二維碼的輪廓的繪製以及填充的實現,當然在這個項目裏面需要的是矢量填充。二維碼的繪製在網上有很多的資源,源代碼也不少,只需要下載一個庫就可以了,實現起來也就幾行代碼的事情,在這裏呢就不要過多的敘述二維碼的庫的下載和基本的繪製問題。下面是我的實現的圖形,有這方面需要的朋友可以參考一下。

 

第一個圖形是我實現的二維碼輪廓的圖形,第二個是實現矢量填充的。剛開始沒有弄懂的時候還折騰了好就纔想到了實現的方法,弄明白方法了其實也挺簡單的。需要用到的話可以參考一下下面的代碼,最近沒有時間去優化了,目的主要是實現了就可以,所以如果誰有更好的方法的話,麻煩大家大家分享一下,我也順便優化優化。

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)));

          }

      }

}

這就是我實現的輪廓和填充圖形的繪製的圖形,如果有需要的朋友哪裏看不懂的話,可以私聊我,大家一起學習。有更好的想法的朋友也希望給我分享一下,讓我也學習一下。在這不勝感激。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章