在C#中直接引用ThoughtWorks.QRCode.dll 類,
ThoughtWorks.QRCode.Codec.QRCodeEncoder encoder = new
QRCodeEncoder();
encoder.QRCodeEncodeMode =
QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;//編碼方法
encoder.QRCodeScale = 4;//大小
encoder.QRCodeVersion =
4;//版本
encoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
String
qrdata = "二維碼資訊";
System.Drawing.Bitmap bp =
encoder.Encode(qrdata.ToString(),
Encoding.GetEncoding("GB2312"));
Image image =
bp;
Object
oMissing =
System.Reflection.Missing.Value;
pictureBox1.Image = bp;
儲存二維碼圖片:
SaveFileDialog sf = new
SaveFileDialog();
sf.Title =
"選擇儲存檔案位置";
sf.Filter = "儲存圖片(*.jpg) |*.jpg|所有檔案(*.*)
|*.*";
//設定預設檔案類型顯示順序
sf.FilterIndex =
1;
//儲存對話方塊是否記憶上次開啟的目錄
sf.RestoreDirectory =
true;
if
(sf.ShowDialog() ==
DialogResult.OK)
{
Image im =
this.pictureBox1.Image;
//獲得檔案路徑
localFilePath =
sf.FileName.ToString();
if (sf.FileName !=
"")
{
fileNameExt = localFilePath.Substring(localFilePath.LastIndexOf("\\") +
1);//擷取檔案名稱,不帶路徑
// newFileName = fileNameExt+DateTime.Now.ToString("yyyyMMdd")
;//給檔案名稱後加上時間
FilePath = localFilePath.Substring(0, localFilePath.LastIndexOf("."));
//擷取檔案路徑,帶檔案名稱,不帶尾碼
string fn =
sf.FileName;
pictureBox1.Image.Save(FilePath +"-"+ DateTime.Now.ToString("yyyyMMdd") +
".jpg");
}
}
//解析二維碼資訊
// QRCodeDecoder decoder = new
QRCodeDecoder();
// String decodedString = decoder.decode(new
QRCodeBitmapImage(new Bitmap(pictureBox1.Image)));
//this.label3.Text = decodedString;
2、另一種方法,引用ZXing類庫。
ZXing是一個開源Java類庫用於解析多種格式的1D/2D條碼。目標是能夠對QR編碼、Data
Matrix、UPC的1D條碼進行解碼。於此同時,它同樣提供
cpp,ActionScript,android,iPhone,rim,j2me,j2se,jruby,C#等方式的類庫。zxing類庫的作用主要是解碼,是目前開源類庫中解碼能力比較強的(商業的另說,不過對於動輒成千上萬的類庫授權費用,的確很值)。
到Googlecode下載相應的代碼
1.下載zxing最新的包
到zxing的首頁:
http://code.google.com/p/zxing/
找到其中的CSharp檔案夾,在vs中開啟並編譯,將obj下debug中的zxing.dll複製並粘帖到你的項目中的bin檔案目錄下,
右擊添加項目引用。將zxing.dll引用到項目中,就可以在需要的地方使用了。
原始碼中有兩處UTF-8的問題,會導致中文出現亂碼(編譯.dll之前修改)
其一:com.google.zxing.qrcode.encoder.encoder類中的
internal
const System.String DEFAULT_BYTE_MODE_ENCODING =
"ISO-8859-1";
此處,將ISO-8859-1改為UTF-8
其二:com.google.zxing.qrcode.decoder.DecodedBitStreamParser類的成員
private
const System.String UTF8 =
"UTF8";
應將UTF8改為UTF-8
產生代碼:
//引用
using
com.google.zxing.qrcode;
using com.google.zxing;
using
com.google.zxing.common;
using ByteMatrix =
com.google.zxing.common.ByteMatrix;
using EAN13Writer =
com.google.zxing.oned.EAN13Writer;
using EAN8Writer =
com.google.zxing.oned.EAN8Writer;
using MultiFormatWriter =
com.google.zxing.MultiFormatWriter;
方法:
string content =
"二維碼資訊";
ByteMatrix byteMatrix =
new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, 300,
300);
Bitmap bitmap =
toBitmap(byteMatrix);
pictureBox1.Image = bitmap;
SaveFileDialog sFD = new
SaveFileDialog();
sFD.Filter =
"儲存圖片(*.png) |*.png|所有檔案(*.*)
|*.*";
sFD.DefaultExt =
"*.png|*.png";
sFD.AddExtension =
true;
if (sFD.ShowDialog() ==
DialogResult.OK)
{
if
(sFD.FileName !=
"")
{
writeToFile(byteMatrix, System.Drawing.Imaging.ImageFormat.Png,
sFD.FileName);
}
}
解析:
if (this.openFileDialog1.ShowDialog() !=
DialogResult.OK)
{
return;
}
Image img =
Image.FromFile(this.openFileDialog1.FileName);
Bitmap bmap;
try
{
bmap =
new Bitmap(img);
}
catch (System.IO.IOException
ioe)
{
MessageBox.Show(ioe.ToString());
return;
}
if (bmap ==
null)
{
MessageBox.Show("Could not decode
image");
return;
}
LuminanceSource source = new
RGBLuminanceSource(bmap, bmap.Width,
bmap.Height);
com.google.zxing.BinaryBitmap bitmap1 = new com.google.zxing.BinaryBitmap(new
HybridBinarizer(source));
Result
result;
try
{
result =
new
MultiFormatReader().decode(bitmap1);
}
catch (ReaderException
re)
{
MessageBox.Show(re.ToString());
return;
}
MessageBox.Show(result.Text);
public static void
writeToFile(ByteMatrix matrix, System.Drawing.Imaging.ImageFormat format, string
file)
{
Bitmap bmap = toBitmap(matrix);
bmap.Save(file, format);
}
public static Bitmap toBitmap(ByteMatrix matrix)
{
int width =
matrix.Width;
int height =
matrix.Height;
Bitmap bmap = new
Bitmap(width, height,
System.Drawing.Imaging.PixelFormat.Format32bppArgb);
for (int x = 0; x < width; x++)
{
for (int
y = 0; y < height;
y++)
{
bmap.SetPixel(x, y, matrix.get_Renamed(x, y) != -1 ?
ColorTranslator.FromHtml("0xFF000000") :
ColorTranslator.FromHtml("0xFFFFFFFF"));
}
}
return
bmap;
}
decoder.decode(new QRCodeBitmapImage(new Bitmap(pictureBox1.Image)));在中加入decoder.decode(new QRCodeBitmapImage(new Bitmap(pb_view.Image)), Encoding.GetEncoding("GB2312"));就可以返回中文