最近刚在做一个项目,里面就需要用到二维码的轮廓的绘制以及填充的实现,当然在这个项目里面需要的是矢量填充。二维码的绘制在网上有很多的资源,源代码也不少,只需要下载一个库就可以了,实现起来也就几行代码的事情,在这里呢就不要过多的叙述二维码的库的下载和基本的绘制问题。下面是我的实现的图形,有这方面需要的朋友可以参考一下。
第一个图形是我实现的二维码轮廓的图形,第二个是实现矢量填充的。刚开始没有弄懂的时候还折腾了好就才想到了实现的方法,弄明白方法了其实也挺简单的。需要用到的话可以参考一下下面的代码,最近没有时间去优化了,目的主要是实现了就可以,所以如果谁有更好的方法的话,麻烦大家大家分享一下,我也顺便优化优化。
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)));
}
}
}
这就是我实现的轮廓和填充图形的绘制的图形,如果有需要的朋友哪里看不懂的话,可以私聊我,大家一起学习。有更好的想法的朋友也希望给我分享一下,让我也学习一下。在这不胜感激。