Java:Java编程实现导出二维码

简介: Java:Java编程实现导出二维码

输出结果

更新中


代码设计

public class QRCodeUtil {

private static final String CHARSET = "utf-8";

private static final String FORMAT_NAME = "JPG";

// 二维码尺寸

private static final int QRCODE_SIZE = 300;

// LOGO宽度

private static final int WIDTH = 60;

// LOGO高度

private static final int HEIGHT = 60;

private static BufferedImage createImage(String content, String imgPath,

  boolean needCompress) throws Exception {

 Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();

 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

 hints.put(EncodeHintType.CHARACTER_SET, CHARSET);

 hints.put(EncodeHintType.MARGIN, 1);

 BitMatrix bitMatrix = new MultiFormatWriter().encode(content,

   BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);

 int width = bitMatrix.getWidth();

 int height = bitMatrix.getHeight();

 BufferedImage image = new BufferedImage(width, height,

   BufferedImage.TYPE_INT_RGB);

 for (int x = 0; x < width; x++) {

  for (int y = 0; y < height; y++) {

   image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000

     : 0xFFFFFFFF);

  }

 }

 if (imgPath == null || "".equals(imgPath)) {

  return image;

 }

 // 插入图片

 QRCodeUtil.insertImage(image, imgPath, needCompress);

 return image;

}

private static void insertImage(BufferedImage source, String imgPath,

  boolean needCompress) throws Exception {

 File file = new File(imgPath);

 if (!file.exists()) {

  System.err.println(""+imgPath+"   该文件不存在!");

  return;

 }

 Image src = ImageIO.read(new File(imgPath));

 int width = src.getWidth(null);

 int height = src.getHeight(null);

 if (needCompress) { // 压缩LOGO

  if (width > WIDTH) {

   width = WIDTH;

  }

  if (height > HEIGHT) {

   height = HEIGHT;

  }

  Image image = src.getScaledInstance(width, height,

    Image.SCALE_SMOOTH);

  BufferedImage tag = new BufferedImage(width, height,

    BufferedImage.TYPE_INT_RGB);

  Graphics g = tag.getGraphics();

  g.drawImage(image, 0, 0, null); // 绘制缩小后的图

  g.dispose();

  src = image;

 }

 // 插入LOGO

 Graphics2D graph = source.createGraphics();

 int x = (QRCODE_SIZE - width) / 2;

 int y = (QRCODE_SIZE - height) / 2;

 graph.drawImage(src, x, y, width, height, null);

 Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);

 graph.setStroke(new BasicStroke(3f));

 graph.draw(shape);

 graph.dispose();

}

public static void encode(String content, String imgPath, String destPath,

  boolean needCompress) throws Exception {

 BufferedImage image = QRCodeUtil.createImage(content, imgPath,

   needCompress);

 mkdirs(destPath);

 String file = new Random().nextInt(99999999)+".jpg";

 ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));

}

public static void mkdirs(String destPath) {

 File file =new File(destPath);    

 //当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)

 if (!file.exists() && !file.isDirectory()) {

  file.mkdirs();

 }

}

/**

 * 生成二维码(内嵌LOGO)

 *

 * @param content

 *            内容

 * @param imgPath

 *            LOGO地址

 * @param destPath

 *            存储地址

 * @throws Exception

 */

public static void encode(String content, String imgPath, String destPath)

  throws Exception {

 QRCodeUtil.encode(content, imgPath, destPath, false);

}

/**

 * 生成二维码

 *

 * @param content

 *            内容

 * @param destPath

 *            存储地址

 * @param needCompress

 *            是否压缩LOGO

 * @throws Exception

 */

public static void encode(String content, String destPath,

  boolean needCompress) throws Exception {

 QRCodeUtil.encode(content, null, destPath, needCompress);

}

/**

 * 生成二维码

 *

 * @param content

 *            内容

 * @param destPath

 *            存储地址

 * @throws Exception

 */

public static void encode(String content, String destPath) throws Exception {

 QRCodeUtil.encode(content, null, destPath, false);

}

/**

 * 生成二维码(内嵌LOGO)

 *

 * @param content

 *            内容

 * @param imgPath

 *            LOGO地址

 * @param output

 *            输出流

 * @param needCompress

 *            是否压缩LOGO

 * @throws Exception

 */

public static void encode(String content, String imgPath,

  OutputStream output, boolean needCompress) throws Exception {

 BufferedImage image = QRCodeUtil.createImage(content, imgPath,

   needCompress);

 ImageIO.write(image, FORMAT_NAME, output);

}

/**

 * 生成二维码

 *

 * @param content

 *            内容

 * @param output

 *            输出流

 * @throws Exception

 */

public static void encode(String content, OutputStream output)

  throws Exception {

 QRCodeUtil.encode(content, null, output, false);

}

/**

 * 解析二维码

 *

 * @param file

 *            二维码图片

 * @return

 * @throws Exception

 */

public static String decode(File file) throws Exception {

 BufferedImage image;

 image = ImageIO.read(file);

 if (image == null) {

  return null;

 }

 BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(

   image);

 BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

 Result result;

 Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();

 hints.put(DecodeHintType.CHARACTER_SET, CHARSET);

 result = new MultiFormatReader().decode(bitmap, hints);

 String resultStr = result.getText();

 return resultStr;

}

/**

 * 解析二维码

 *

 * @param path

 *            二维码图片地址

 * @return

 * @throws Exception

 */

public static String decode(String path) throws Exception {

 return QRCodeUtil.decode(new File(path));

}

public static void main(String[] args) throws Exception {

 String text = "http://www.jason-niu.com";

 QRCodeUtil.encode(text, "G:/创业/云崖牛logo小.jpg", "G:/创业/云崖牛barcode", true);

}

}


相关文章
|
4天前
|
Java 开发者
【Java编程新纪元】JDK 22:超级构造函数来袭,super(...) 前导语句改写编程规则!
【9月更文挑战第6天】JDK 22的超级构造函数特性是Java编程语言发展史上的一个重要里程碑。它不仅简化了代码编写,还提升了代码的可读性和维护性。我们有理由相信,在未来的Java版本中,还将有更多令人兴奋的新特性等待我们去发现和应用。让我们共同期待Java编程新纪元的到来!
|
4天前
|
Oracle Java 关系型数据库
【颠覆性升级】JDK 22:超级构造器与区域锁,重塑Java编程的两大基石!
【9月更文挑战第6天】JDK 22的发布标志着Java编程语言在性能和灵活性方面迈出了重要的一步。超级构造器和区域锁这两大基石的引入,不仅简化了代码设计,提高了开发效率,还优化了垃圾收集器的性能,降低了应用延迟。这些改进不仅展示了Oracle在Java生态系统中的持续改进和创新精神,也为广大Java开发者提供了更多的可能性和便利。我们有理由相信,在未来的Java编程中,这些新特性将发挥越来越重要的作用,推动Java技术不断向前发展。
|
2天前
|
Java 开发者
Java中的多线程编程基础与实战
【9月更文挑战第6天】本文将通过深入浅出的方式,带领读者了解并掌握Java中的多线程编程。我们将从基础概念出发,逐步深入到代码实践,最后探讨多线程在实际应用中的优势和注意事项。无论你是初学者还是有一定经验的开发者,这篇文章都能让你对Java多线程有更全面的认识。
13 1
|
9天前
|
算法 Java 开发者
Java 编程入门:从零到一的旅程
本文将带领读者开启Java编程之旅,从最基础的语法入手,逐步深入到面向对象的核心概念。通过实例代码演示,我们将一起探索如何定义类和对象、实现继承与多态,并解决常见的编程挑战。无论你是编程新手还是希望巩固基础的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
9天前
|
安全 Java 应用服务中间件
网络安全的护城河:漏洞防御与加密技术深入浅出Java并发编程
【8月更文挑战第31天】在数字世界的棋盘上,每一次点击都可能是一步棋。网络安全的战场无声却激烈,漏洞如同裂缝中的风,悄无声息地侵袭着数据的堡垒。本文将揭示网络漏洞的隐蔽角落,探讨如何通过加密技术筑起防线,同时提升个人和组织的安全意识,共同守护我们的数字家园。
|
7天前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第2天】在Java的世界里,对象序列化和反序列化就像是给数据穿上了一件隐形的斗篷。它们让数据能够轻松地穿梭于不同的系统之间,无论是跨越网络还是存储在磁盘上。本文将揭开这层神秘的面纱,带你领略序列化和反序列化的魔法,并展示如何通过代码示例来施展这一魔法。
10 0
|
9天前
|
Java Apache Maven
Java中使用poi+poi-tl实现根据模板导出word文档
这个过程不仅简化了文档生成的工作,而且保证了生成文档的一致性与准确性,特别适合于那些需要生成大量文档的自动化场景。通过以上步骤,Java开发人员可以实现高效、可靠的Word文档导出功能。
23 0
|
9天前
|
Java 开发者
Java编程中的异常处理机制探究
【8月更文挑战第31天】在Java的世界中,异常处理是维护程序稳定性的重要工具。它像是一套精密的免疫系统,保护代码免受错误的侵袭,确保程序能够优雅地应对意外情况。本文将带你走进Java的异常处理机制,了解如何捕获和处理异常,以及自定义异常类的创建与应用,让你的代码更加健壮,运行更加顺畅。
|
9天前
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
22 0
|
9天前
|
开发者 C# 存储
WPF开发者必读:资源字典应用秘籍,轻松实现样式与模板共享,让你的WPF应用更上一层楼!
【8月更文挑战第31天】在WPF开发中,资源字典是一种强大的工具,用于共享样式、模板、图像等资源,提高了应用的可维护性和可扩展性。本文介绍了资源字典的基础知识、创建方法及最佳实践,并通过示例展示了如何在项目中有效利用资源字典,实现资源的重用和动态绑定。
23 0
下一篇
DDNS