经过一段时间的研究,在原来没有添加logo图片的二维码中添加了logo图片。
其实原理比较简单(添加logo图片),就是在生成的二维码中重新绘制一个图片上去就ok了。但是图片的大小是有限制的,在容错率较低的情况下,如果中间logo图片比较大会影响二维码的解析。一般在生成是使用高等级生成二维码。
但是问题来了,那中间的logo是本地的图片还是网络图片呢,图片的大小如何设置呢。根据相关资料显示一般在logo图片的比例不超过整个二维码图片的1/3是不会影响二维码的解析的。
好,现在通过一个函数对传入的图片进行压缩:
#region 图像缩放
/// <summary>
/// 缩放图片
/// </summary>
/// <param name="pPath">图片保存路径.jpg</param>
/// <param name="imageWidth">目标图片宽度</param>
private static Bitmap SetImageZoom(string pPath,int imageWidth)
{
//定义一个位图
Bitmap partImg = null;
//取得图片并缩放
using (System.Drawing.Image originalImg = System.Drawing.Image.FromFile(pPath))
{
//原图和目标图片的宽度相同
if (originalImg.Width == imageWidth && originalImg.Height == imageWidth)
{
return (Bitmap)originalImg;
}
//原图和目标图片大小不同
System.Drawing.Image.GetThumbnailImageAbort callback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
//将原图片缩放到当前缩放的大小
System.Drawing.Image zoomImg = originalImg.GetThumbnailImage(imageWidth, imageWidth, callback, IntPtr.Zero);
partImg = new Bitmap(imageWidth, imageWidth);
Graphics graphics = Graphics.FromImage(partImg);
Rectangle destRect = new Rectangle(new Point(0, 0), new Size(imageWidth, imageWidth));//目标位置
Rectangle origRect = new Rectangle(new Point(0, 0), new Size(imageWidth, imageWidth));//原图位置(默认从原图中截取的图片大小等于目标图片的大小)
#region 文字水印
///文字水印
System.Drawing.Graphics G = System.Drawing.Graphics.FromImage(partImg);
//System.Drawing.Font f = new Font("Lucida Grande", 6);
//System.Drawing.Brush b = new SolidBrush(Color.Gray);
G.Clear(Color.White);
graphics.DrawImage(zoomImg, destRect, origRect, GraphicsUnit.Pixel);
G.Dispose();
#endregion
originalImg.Dispose();
}
return partImg;
}
/// <summary>
/// 缩放图片
/// </summary>
/// <param name="image">log图片</param>
/// <param name="imageWidth">目标图片宽度,高度</param>
private static Bitmap SetImageZoom(System.Drawing.Image image, int imageWidth)
{
//定义一个位图
Bitmap partImg = null;
//取得图片并缩放
using (System.Drawing.Image originalImg = image)
{
//原图和目标图片的宽度相同
if (originalImg.Width == imageWidth && originalImg.Height == imageWidth)
{
return (Bitmap)originalImg;
}
//原图和目标图片大小不同
System.Drawing.Image.GetThumbnailImageAbort callback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
//将原图片缩放到当前缩放的大小
System.Drawing.Image zoomImg = originalImg.GetThumbnailImage(imageWidth, imageWidth, callback, IntPtr.Zero);
partImg = new Bitmap(imageWidth, imageWidth);
Graphics graphics = Graphics.FromImage(partImg);
Rectangle destRect = new Rectangle(new Point(0, 0), new Size(imageWidth, imageWidth));//目标位置
Rectangle origRect = new Rectangle(new Point(0, 0), new Size(imageWidth, imageWidth));//原图位置(默认从原图中截取的图片大小等于目标图片的大小)
#region 文字水印
///文字水印
System.Drawing.Graphics G = System.Drawing.Graphics.FromImage(partImg);
//System.Drawing.Font f = new Font("Lucida Grande", 6);
//System.Drawing.Brush b = new SolidBrush(Color.Gray);
G.Clear(Color.White);
graphics.DrawImage(zoomImg, destRect, origRect, GraphicsUnit.Pixel);
G.Dispose();
#endregion
originalImg.Dispose();
}
return partImg;
}
/// <summary>
/// 定义一个回调函数
/// </summary>
/// <returns></returns>
private static bool ThumbnailCallback()
{
return false;
}
#endregion
当然,这个函数比较粗糙,两个函数可以合并为一个而且有些代码是不必要的,有待优化。
然后就是将中间的logo绘制到二维码上了哈:
#region 绘制中间log
private Bitmap DrawCenterLogImage(Bitmap originalimage, Bitmap centerlogimage,int beginpoint)
{
//定义一个画板
Graphics newG = Graphics.FromImage(originalimage);
//定义一个坐标
Point point = new Point(beginpoint, beginpoint);
newG.DrawImage(centerlogimage, point);
newG.Dispose();
return originalimage;
}
#endregion
ok,以上就是对源码的修改了。
接着我们测试能不能用呢?
我们新建一个winform程序,这样很快就能够看到效果了。新建一个窗体,在窗体中拖放一个picturebox空间,命名pictureBox1.
ok,我们看看效果如何:
当然你可以扫一扫哦。扫出的信息就是hello world了哈。
当然,你还可以设置其他的参数,图片的宽度,高度,前景色,背景色,容错等级,版本,这些都是可以设置的。
你可以点击下载dll引用到你自己的项目中。同时你可以使用本地的图片作为logo,只是在调用的时候传递的是本地服务器的绝对路径。
#region 绘制有log缩略图的二维码
String data = txtEncodeData.Text;
//服务器图片路径
string ImageURL = "../../Images/请叫我小白.png";
//将相对路径转化为绝对路径
ImageURL = System.IO.Path.GetFullPath(ImageURL);
picEncode.Image = qrCodeEncoder.Encode(data, ImageURL, 1);
//picEncode.Image = qrCodeEncoder.Encode(data, "http://avatar.csdn.net/4/C/8/1_tigertianx.jpg", 2);
#endregion