ใช้ชุด ZXING เพื่อสร้างรหัส QR ที่ตำแหน่งที่ระบุของภาพพื้นหลังการ์ดที่เตรียมไว้และวางเนื้อหาข้อความที่ระบุ (ที่อยู่ลิงก์ข้อความ ฯลฯ ) และวางไว้ในตำแหน่งนั้นและเพิ่มหมายเลขบัตรในที่สุด
ขั้นตอน:
1). สร้างภาพพื้นหลังตามที่แสดงด้านล่าง:
2). สร้างวัตถุ BufferedImage รหัส QR รหัสมีดังนี้:
/ ** * * @title: tobufferedImage * @description: แปลงข้อความเป็น QR รหัสภาพวัตถุ * @param ข้อความ * qr รหัสเนื้อหา * @param width * qr รหัสความสูง * @param ความสูง * ความกว้างสองหลัก * @param * @param โยนข้อยกเว้น {int black = 0xff000000; int White = 0xffffffff; Hashtable <ENCODEHINTTYPE, OBJECT> HINTS = ใหม่ HASHTABLE <ENCODEHINTTYPE, OBJECT> (); คำแนะนำ (encodeHintType.character_set, "UTF-8"); // การเข้ารหัสชุดอักขระที่ใช้โดยเนื้อหาเป็นคำใบ้ (ENCODEHINTTYPE.MARGIN, 1); bitmatrix matrix = new MultiformatWriter (). ENCODE (TEXT, BARCODEFORMAT.QR_CODE, ความกว้าง, ความสูง, คำแนะนำ); BufferedImage Image = New BufferedImage (ความกว้าง, ความสูง, bufferedImage.type_int_rgb); สำหรับ (int x = 0; x <width; x ++) {สำหรับ (int y = 0; y <ความสูง; y ++) {image.setrgb (x, y, matrix.get (x, y)? สีดำ: สีขาว); }} return image; -3). สร้างรหัส QR ที่ตำแหน่งที่ระบุของภาพพื้นหลังการ์ดรหัสมีดังนี้:
/ ** * * @title: MarkimageByCode * @description: เพิ่มรหัส QR ไปยังตำแหน่งที่ระบุของภาพ * @param img * qr รหัสภาพวัตถุ * @param srcimgpath * ภาพพื้นหลัง * @param targetpath * แผนที่เป้าหมาย * @param MarkImageByCode (Image IMG, String SrcimgPath, String TargetPath, int positionWidth, int positionHeight) {OutputStream OS = null; ลอง {image srcimg = imageio.read (ไฟล์ใหม่ (srcimgpath)); bufferedImage buffimg = new bufferedImage (srcimg.getWidth (null), srcimg.getheight (null), bufferedimage.type_int_rgb); // 1. รับ brush object graphics2d g = buffimg.createGraphics (); // 2. ตั้งค่าการประมวลผลขอบ jagged ของส่วนบรรทัด g.setrenderinghint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilinear); G.DrawImage (srcimg.getScaledInstance (srcimg.getWidth (null), srcimg.getheight (null), image.scale_smooth), 0, 0, null); G.SetComposite (alphacomposite.getInstance (alphacomposite.src_atop, alpha)); // 3. ตำแหน่งรหัส QR G.DrawImage (IMG, PositiveWidth, PositionHeight, Null); G.SetComposite (alphacomposite.getInstance (alphacomposite.src_over)); // 4. ปล่อยทรัพยากร g.dispose (); // 5. สร้างภาพ (ขอแนะนำให้สร้าง PNG, JPG จะถูกบิดเบือน) OS = ใหม่ FileOutputStream (TargerPath); imageio.write (buffimg, "png", OS); System.out.println ("การสร้างภาพรหัส QR สำเร็จ"); } catch (exception e) {e.printstacktrace (); } ในที่สุด {ลอง {ถ้า (null! = os) os.close (); } catch (exception e) {e.printstacktrace (); - 4). เพิ่มหมายเลขบัตรลงในการ์ด
/ ** * * @title: presstext * @description: เพิ่มข้อความไปยังตำแหน่งที่ระบุของภาพ * @param presstext * เนื้อหาข้อความ * @param srcimagefile * ภาพต้นฉบับ * @param destimagefile * ภาพเป้าหมาย * @param x * แนวนอน pressText (สตริง presstext, string srcimagefile, สตริง destimagefile, int x, int y, ลอยอัลฟ่า) {ลอง {ไฟล์ img = ไฟล์ใหม่ (srcimagefile); Image SRC = Imageio.read (IMG); ความกว้าง int = src.getWidth (null); ความสูง int = src.getheight (null); BufferedImage Image = New BufferedImage (ความกว้าง, ความสูง, bufferedImage.type_int_rgb); graphics2d g = image.createGraphics (); // เปิดข้อความต่อต้านการใช้งานเพื่อลบข้อความ Glitch G.Setrenderinghint (renderinghints.key_text_antialiasing, renderinghints.value_text_antialias_on); G.DrawImage (src, 0, 0, ความกว้าง, ความสูง, null); // ตั้งค่าสี g.setColor (สีใหม่ (89, 87, 87)); // ตั้งค่าตัวอักษร g.setfont (ฟอนต์ใหม่ ("Fangzheng lanting black_gbk", font.bold, 14)); G.SetComposite (alphacomposite.getInstance (alphacomposite.src_atop, alpha)); // พารามิเตอร์แรก -> ตั้งค่าเนื้อหาสองพารามิเตอร์ถัดไป -> พิกัดตำแหน่งของข้อความบนรูปภาพ (x, y) G.DrawString (pressText, x, y); G.Dispose (); Imageio.write ((bufferedImage) image, "png", ไฟล์ใหม่ (destimagefile)); // output ไปยังสตรีมไฟล์} catch (Exception e) {e.printstacktrace (); - ตัวอย่าง:
รหัส:
รหัสทดสอบ
codetest คลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่นข้อยกเว้น {สตริงข้อความ = "http://www.xxx.com/"; // qr รหัสเนื้อหา // สร้างรหัส QR // สร้างภาพ QR image เพื่อจัดเก็บสตริงไดเรกทอรี targetAth = "f:/qrcode/targetImg/" + utils.toStr (); // สร้างไดเรกทอรี utils.makedirs (TargetPath); int เริ่มต้น = 100; // รหัสเริ่มต้นหมายเลข int end = 101; // หมายเลขสิ้นสุดรหัสสำหรับ (int i = เริ่มต้น; i <= end; i ++) {// สร้างหมายเลข 16 หลักที่มีวันที่เช่น 20161214000001 รหัสสตริง = utils.toStr () // รับ qr bufferedimage image = utils.tobufferedimage (text + "? paycode =" + รหัส, 240,240); // สร้างรูปภาพของการ์ดยืนด้วยภาพพื้นหลัง + รหัส QR utils.markimageByCode (ภาพ, "f: /qrcode/srcimg/src.png", targetath + "/" + รหัส + ".png", 340, 160); // เพิ่มหมายเลขรหัสของการ์ดยืนลงในรูป utils.pressText (รหัส, targetPath + "/" + รหัส + ".png", targetath + "/" + รหัส + ".png", 390, 417, 0.5f); } // สร้างรหัส QR}} ผล:
การเรนเดอร์ภาพแบทช์ที่สร้างขึ้นมีดังนี้
ภาพแบทช์:
รหัส UTILS:
แพ็คเกจ cn.utils.code; นำเข้า java.awt.alphacomposite; นำเข้า Java.awt.Color; นำเข้า Java.awt.Font; นำเข้า java.awt.graphics2d; นำเข้า java.awt.image; นำเข้า java.awt.renderinghints; นำเข้า java.awt.image.bufferedimage; นำเข้า Java.io.File; นำเข้า Java.io.FileOutputStream; นำเข้า Java.io.OutputStream; นำเข้า java.text.decimalformat; นำเข้า java.text.simpledateFormat; นำเข้า java.util.date; นำเข้า java.util.hashtable; นำเข้า Javax.imageio.imageio; นำเข้า com.google.zxing.barcodeformat; นำเข้า com.google.zxing.encodehinttype; นำเข้า com.google.zxing.multiformatwriter; นำเข้า com.google.zxing.common.bitmatrix; /** คลาสเครื่องมือ */ คลาสบทคัดย่อสาธารณะ Utils {/ ** รูปแบบวันที่: yyyy-mm-dd hh: mm: ss*/ สตริงคงที่สาธารณะ df_datetime = "yyyymmdd"; ลอยตัวแบบคงที่แบบคงที่อัลฟ่า = 1f; / ** * * @title: tobufferedImage * @description: แปลงข้อความเป็น QR รหัสภาพวัตถุ * @param ข้อความ * qr รหัสเนื้อหา * @param width * qr รหัสความสูง * @param ความสูง * ความกว้างสองหลัก * @param * @param โยนข้อยกเว้น {int black = 0xff000000; int White = 0xffffffff; Hashtable <ENCODEHINTTYPE, OBJECT> HINTS = ใหม่ HASHTABLE <ENCODEHINTTYPE, OBJECT> (); คำแนะนำ (encodeHintType.character_set, "UTF-8"); // การเข้ารหัสชุดอักขระที่ใช้โดยเนื้อหาเป็นคำใบ้ (ENCODEHINTTYPE.MARGIN, 1); bitmatrix matrix = new MultiformatWriter (). ENCODE (TEXT, BARCODEFORMAT.QR_CODE, ความกว้าง, ความสูง, คำแนะนำ); BufferedImage Image = New BufferedImage (ความกว้าง, ความสูง, bufferedImage.type_int_rgb); สำหรับ (int x = 0; x <width; x ++) {สำหรับ (int y = 0; y <ความสูง; y ++) {image.setrgb (x, y, matrix.get (x, y)? สีดำ: สีขาว); }} return image; } / ** * * @title: MarkimageByCode * @description: เพิ่มรหัส QR ไปยังตำแหน่งที่ระบุของภาพ * @param img * qr รหัสภาพวัตถุ * @param srcimgpath * ภาพพื้นหลัง * @param เป้าหมาย Void MarkimageByCode (Image IMG, String SrcimgPath, String TargetPath, int positionWidth, int positionHeight) {outputStream OS = null; ลอง {image srcimg = imageio.read (ไฟล์ใหม่ (srcimgpath)); bufferedImage buffimg = new bufferedImage (srcimg.getWidth (null), srcimg.getheight (null), bufferedimage.type_int_rgb); // 1. รับ brush object graphics2d g = buffimg.createGraphics (); // 2. ตั้งค่าการประมวลผลขอบ jagged ของส่วนบรรทัด g.setrenderinghint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilinear); G.DrawImage (srcimg.getScaledInstance (srcimg.getWidth (null), srcimg.getheight (null), image.scale_smooth), 0, 0, null); G.SetComposite (alphacomposite.getInstance (alphacomposite.src_atop, alpha)); // 3. ตำแหน่งรหัส QR G.DrawImage (IMG, PositiveWidth, PositionHeight, Null); G.SetComposite (alphacomposite.getInstance (alphacomposite.src_over)); // 4. ปล่อยทรัพยากร g.dispose (); // 5. สร้างภาพ (ขอแนะนำให้สร้าง PNG, JPG จะบิดเบือน) OS = ใหม่ FileOutputStream (TargerPath); imageio.write (buffimg, "png", OS); System.out.println ("การสร้างภาพรหัส QR สำเร็จ"); } catch (exception e) {e.printstacktrace (); } ในที่สุด {ลอง {ถ้า (null! = os) os.close (); } catch (exception e) {e.printstacktrace (); }}} / ** * * @title: pressText * @description: เพิ่มข้อความลงในตำแหน่งที่ระบุของภาพ * @param presstext * เนื้อหาข้อความ * @param srcimagefile * ภาพต้นฉบับ * @param destimagefile * @target image * @param x * void static สุดท้าย presstext (สตริง presstext, สตริง srcimagefile, สตริง destimagefile, int x, int y, float alpha) {ลอง {ไฟล์ img = ไฟล์ใหม่ (srcimagefile); Image SRC = Imageio.read (IMG); ความกว้าง int = src.getWidth (null); ความสูง int = src.getheight (null); BufferedImage Image = New BufferedImage (ความกว้าง, ความสูง, bufferedImage.type_int_rgb); graphics2d g = image.createGraphics (); // เปิดข้อความต่อต้านการใช้งานเพื่อลบข้อความ Glitch G.Setrenderinghint (renderinghints.key_text_antialiasing, renderinghints.value_text_antialias_on); G.DrawImage (src, 0, 0, ความกว้าง, ความสูง, null); // ตั้งค่าสี g.setColor (สีใหม่ (89, 87, 87)); // ตั้งค่าตัวอักษร g.setfont (ฟอนต์ใหม่ ("Fangzheng lanting black_gbk", font.bold, 14)); G.SetComposite (alphacomposite.getInstance (alphacomposite.src_atop, alpha)); // พารามิเตอร์แรก -> เนื้อหาที่ตั้งค่าพารามิเตอร์สองตัวถัดไป -> ตำแหน่งพิกัดของข้อความบนภาพ (x, y) G.DrawString (pressText, x, y); G.Dispose (); Imageio.write ((bufferedimage) image, "png", ไฟล์ใหม่ (destimagefile)); // เอาต์พุตไปยังสตรีมไฟล์} catch (Exception e) {E.printStackTrace (); }} // วันที่เป็นสตริง/** จัดรูปแบบวันที่เป็นสตริงรูปแบบเริ่มต้นคือ yyyy-mm-dd hh: mm: ss วันที่เริ่มต้นคือวันที่ปัจจุบัน */ สตริงคงที่สาธารณะ toStr () {return toStr (df_datetime); } /** จัดรูปแบบวันที่เป็นสตริงรูปแบบจะถูกระบุโดยรูปแบบพารามิเตอร์วันที่เริ่มต้นคือวันที่ปัจจุบันค่ารูปแบบสามารถใช้ในค่าคงที่ของคลาสนี้หรือปรับแต่ง */ String String สาธารณะ TOSTR (รูปแบบสตริง) {return TOSTR (รูปแบบ, วันที่ใหม่ ()); } /** จัดรูปแบบวันที่เป็นสตริงรูปแบบเริ่มต้นคือ YYYY-MM-DD HH: MM: SS วันที่จะถูกระบุโดยวันที่พารามิเตอร์ */ สตริงคงที่สาธารณะ toStr (วันที่วันที่) {ส่งคืน toStr (df_datetime, วันที่); } /** จัดรูปแบบวันที่เป็นสตริงรูปแบบจะถูกระบุโดยรูปแบบพารามิเตอร์และวันที่ถูกระบุโดยวันที่พารามิเตอร์ ค่ารูปแบบสามารถใช้ในค่าคงที่ของคลาสนี้หรือปรับแต่ง */ String String สาธารณะ TOSTR (รูปแบบสตริงวันที่) {ส่งคืน SimpledateFormat ใหม่ (รูปแบบ) .Format (วันที่); } รูปแบบสตริงคงที่สาธารณะ (int num) {decimalformat df = decimalformat ใหม่ ("000000"); string str2 = df.format (num); กลับมา str2; } รูปแบบสตริงคงที่สาธารณะ (int num) {decimalformat df = decimalformat ใหม่ ("000000"); string str2 = df.format (num); กลับมา str2; } public boolean makedirs แบบคงที่ (String filePath) {File Folder = ไฟล์ใหม่ (FilePath); return (folder.exists () && folder.isdirectory ())? จริง: โฟลเดอร์. mkdirs (); - เทคนิคที่ใช้:
1. ใช้เครื่องมือ ZXING เพื่อสร้างรหัส QR
1) ที่อยู่ดาวน์โหลด: http://repo1.maven.org/maven2/com/google/zxing/javase/3.1.0/
2). การกำหนดค่า maven
<Ederency> <sderctId> com.google.zxing </groupId> <ratifactid> Core </artifactId> <version> 2.2 </Serve> </Serperency>
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น