国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
QR二維碼生成器源碼(中間可插入小圖片)

二維碼終于火了,現(xiàn)在大街小巷大小商品廣告上的二維碼標(biāo)簽都隨處可見(jiàn),而且大都不是簡(jiǎn)單的純二維碼,而是中間有個(gè)性圖標(biāo)的二維碼。

我之前做了一個(gè)使用google開(kāi)源項(xiàng)目zxing實(shí)現(xiàn)二維碼、一維碼編碼解碼的程序并開(kāi)放了源碼(用C#實(shí)現(xiàn)的條形碼和二維碼編碼解碼器),今天繼續(xù)在此程序基礎(chǔ)上,實(shí)現(xiàn)二維碼中間加小圖片。

背景知識(shí)

QRcode使用里德-所羅門(mén)碼來(lái)進(jìn)行錯(cuò)誤修正。對(duì)于我們來(lái)說(shuō),里德-所羅門(mén)編碼有兩個(gè)非常重要的特性。第一,它是一種顯式系統(tǒng)碼,也就是說(shuō),你可以在最終的編碼中直接看到原有的信息。就好比我們對(duì)”hello world”進(jìn)行編碼,最終看到的是”hello world”以及其后面跟隨的幾個(gè)容錯(cuò)碼。第二點(diǎn),里德-所羅門(mén)編碼是可以被”異或”的,將兩個(gè)不同里德-所羅門(mén)編碼得到的結(jié)果異或運(yùn)算后會(huì)得到一個(gè)新的里德-所羅門(mén)碼,并且這個(gè)新碼的原碼即是原來(lái)兩個(gè)原碼的異或。如果你想知道為什么這兩個(gè)特性會(huì)成立,請(qǐng)看Finite Field Arithmetic and Reed-Solomon Coding.

QRcode

一副QRcode圖像會(huì)定義一些獨(dú)特的描述符來(lái)幫助人們或者電腦識(shí)別出自己是一張QRcode。這種描述符隨著QRcode的大小不同而略有區(qū)別——越大的QRcode圖像擁有越多的描述符。但是對(duì)于人的識(shí)別來(lái)說(shuō),特征最明顯的還是圖片的四個(gè)角的符號(hào)是固定的,看到這樣的四個(gè)角人類(lèi)就本能的反應(yīng):這是一個(gè)QRcode。

(實(shí)際上,我們可以通過(guò)讀取圖像最左上角的兩個(gè)象素點(diǎn)來(lái)判斷編碼的冗余程度。定義黑色為0,白色為1,那么如果看到00則是L級(jí)別的冗余,01是M,10是Q,11則是最高的H級(jí)別冗余。

有了上面的這些工作,我們可以非常容易的知道原碼信息在圖像中的位置。然后通過(guò)改變自己的原碼信息,就可以改變圖像中的像素以至于可以在里面作圖了。雖說(shuō)如此,下面的一些情形可以讓事情變得更有趣。

 

我做的二維碼插入圖片:

之前我給大家免費(fèi)提供了使用zxing開(kāi)源項(xiàng)目改造而成的一二維碼編碼解碼器,但未能插入圖片。這次經(jīng)過(guò)一番努力,成功將圖片插入二維碼,并能編碼和解碼。

插入圖片的關(guān)鍵在于二維碼容錯(cuò)系數(shù)的調(diào)整。

界面:

 

程序界面如下:

其中WinForm項(xiàng)目是我的Demo程序,zxing是Google的一個(gè)開(kāi)源二維碼項(xiàng)目。

生成二維碼的代碼:

               //構(gòu)造二維碼寫(xiě)碼器                MultiFormatWriter mutiWriter = new com.google.zxing.MultiFormatWriter();                Hashtable hint=new Hashtable();                hint.Add(EncodeHintType.CHARACTER_SET,"UTF-8");                hint.Add(EncodeHintType.ERROR_CORRECTION,com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H);                //生成二維碼                ByteMatrix bm = mutiWriter.encode(txtMsg.Text, com.google.zxing.BarcodeFormat.QR_CODE, 300, 300,hint);                Bitmap img = bm.ToBitmap();                //要插入到二維碼中的圖片                Image middlImg = QRMiddleImg.Image;                 //獲取二維碼實(shí)際尺寸(去掉二維碼兩邊空白后的實(shí)際尺寸)                System.Drawing.Size realSize = mutiWriter.GetEncodeSize(txtMsg.Text, com.google.zxing.BarcodeFormat.QR_CODE, 300, 300);                //計(jì)算插入圖片的大小和位置                int middleImgW = Math.Min((int)(realSize.Width / 3.5), middlImg.Width);                int middleImgH = Math.Min((int)(realSize.Height / 3.5),middlImg.Height);                int middleImgL = (img.Width - middleImgW) / 2;                int middleImgT = (img.Height - middleImgH) / 2;                //將img轉(zhuǎn)換成bmp格式,否則后面無(wú)法創(chuàng)建 Graphics對(duì)象                Bitmap bmpimg = new Bitmap(img.Width, img.Height,System.Drawing.Imaging.PixelFormat.Format32bppArgb);                using (Graphics g = Graphics.FromImage(bmpimg))                {                    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;                    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;                    g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;                    g.DrawImage(img, 0, 0);                }                //在二維碼中插入圖片                System.Drawing.Graphics MyGraphic = System.Drawing.Graphics.FromImage(bmpimg);                //白底                MyGraphic.FillRectangle(Brushes.White,middleImgL, middleImgT, middleImgW, middleImgH);                MyGraphic.DrawImage(middlImg, middleImgL, middleImgT, middleImgW, middleImgH);                pictureBox1.Image = bmpimg;                //自動(dòng)保存圖片到當(dāng)前目錄                string filename = System.Environment.CurrentDirectory + "\\QR" + DateTime.Now.Ticks.ToString() + ".jpg";                bmpimg.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);                lbshow.Text = "圖片已保存到:" + filename;

解析二維碼的代碼:

           //構(gòu)建解碼器            MultiFormatReader mutiReader = new com.google.zxing.MultiFormatReader();            Bitmap img = (Bitmap)Bitmap.FromFile(opFilePath);            if (img == null)                return;            LuminanceSource ls = new RGBLuminanceSource(img, img.Width, img.Height);            BinaryBitmap bb = new BinaryBitmap(new com.google.zxing.common.HybridBinarizer(ls));            //注意  必須是Utf-8編碼            Hashtable hints = new Hashtable();            hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");            Result r = mutiReader.decode(bb, hints);            txtmsg2.Text = r.Text;            lbshow.Text = "解碼成功!";

 

要在二維碼中插入圖片且可以正常解碼,關(guān)鍵是要注意以下兩個(gè)地方

1、必須調(diào)整二維碼的容錯(cuò)參數(shù)ErrorCorrectionLevel

Hashtable hint=new Hashtable();
hint.Add(EncodeHintType.CHARACTER_SET,"UTF-8");
hint.Add(EncodeHintType.ERROR_CORRECTION,com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H);

hint是生成二維碼的方法中最后一個(gè)參數(shù),這個(gè)參數(shù)是一個(gè)hashtable,這里可以設(shè)置二維碼的編碼、容錯(cuò)系數(shù)等。

容錯(cuò)系數(shù)越高,生成的二維碼圖片越復(fù)雜,可以容忍二維碼被污垢弄贓,甚至中間可以加一個(gè)小圖片,識(shí)別也不受影響。

 

2、第二個(gè)要注意的地方是圖片大小

從二維碼的識(shí)別原理可以知道,二維碼中原始信息被加密在下圖黑色部分,而紅色部分都是冗余信息,紅色部分都是可以被自己的圖片替換的。

為了插入圖片的完整性,我們選擇在最中間插入,而且長(zhǎng)寬建議為整個(gè)二維碼的3/7至1/3

//計(jì)算插入圖片的大小和位置int middleImgW = Math.Min((int)(realSize.Width / 3.5), middlImg.Width);int middleImgH = Math.Min((int)(realSize.Height / 3.5),middlImg.Height);int middleImgL = (img.Width - middleImgW) / 2;int middleImgT = (img.Height - middleImgH) / 2;

我們的例子中用的就是2/7的比例。

 

下載地址:

DEMO    Code


本文轉(zhuǎn)自:http://www.cnblogs.com/tuyile006/p/3416008.html

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Python 生成、解析二維碼
java生成二維碼的三個(gè)工具
安卓實(shí)現(xiàn)個(gè)性彩色好看的二維碼
用C#實(shí)現(xiàn)的條形碼和二維碼編碼解碼器
Python使用QRCode模塊生成二維碼
Java 生成 / 解碼 QR碼
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服