最近剛在做一個項目,裏面就需要用到二維碼的輪廓的繪製以及填充的實現,當然在這個項目裏面需要的是矢量填充。二維碼的繪製在網上有很多的資源,源代碼也不少,只需要下載一個庫就可以了,實現起來也就幾行代碼的事情,在這裏呢就不要過多的敘述二維碼的庫的下載和基本的繪製問題。下面是我的實現的圖形,有這方面需要的朋友可以參考一下。
第一個圖形是我實現的二維碼輪廓的圖形,第二個是實現矢量填充的。剛開始沒有弄懂的時候還折騰了好就纔想到了實現的方法,弄明白方法了其實也挺簡單的。需要用到的話可以參考一下下面的代碼,最近沒有時間去優化了,目的主要是實現了就可以,所以如果誰有更好的方法的話,麻煩大家大家分享一下,我也順便優化優化。
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)));
}
}
}
這就是我實現的輪廓和填充圖形的繪製的圖形,如果有需要的朋友哪裏看不懂的話,可以私聊我,大家一起學習。有更好的想法的朋友也希望給我分享一下,讓我也學習一下。在這不勝感激。