程序员在上海之四
2016-10-22 18:34
225 查看
今天主要分享下前段时间做微信二维码的一些问题,我们都知道二维码的生产可以放到java后端,也可以直接使用jQuery插件jquery.qrcode.min.js来简单实现。下面简单分享下两种方式:
1、java代码生产二维码。
具体实现如下:
辅助类如下:
以上是简单java实现二维码的生产,你可以通过扫描来查看是不是你想要的,下面来看下前段js怎么生成二维码的,这里我把工具改为WebStorm这样我们不需要每次都启动tomcat服了,它直接集成了这些功能,方便一些纯前端开发。最好参考《点击打开链接》因为这里说的太简单明了了。
接下来是关于文本内容过长导致二维码识别度降低的问题,我们这是会选择吧长链接转为短链接,具体可以参考《点击打开链接》下面是个人的测试案例
public static String Long2short(String url) throws IOException{
//生成短连接
String reqUrl = "http://980.so/api.php?url="+ URLEncoder.encode(url,"UTF-8");
logger.info("------转换之前的reqUrl="+reqUrl);
Map<String,String> map = new HashMap<String,String>();
String tinyUrl = GetRequest.getRequest(reqUrl,map);//http请求
if(tinyUrl != null && tinyUrl.startsWith("http://980.so/"))
{
url = tinyUrl;
}
logger.info("------转换之后的url="+url);
return url;
}
主函数也贴出来吧
public static void main(String[] args) throws IOException {
String url = "https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=monline_dg&wd=980.so&oq=js%E7%94%9F%E6%88%90%E4%BA%8C%E7%BB%B4%E7%A0%81&rsv_pq=9f72e3720004d0d6&rsv_t=4723nWbFLUDh%2BxsJxCGBAJ%2BIyt%2F3OrwBNiGnGzQOpohNKYSqP9%2FbfPxFd9RIHq9s6A&rqlang=cn&rsv_enter=1&inputT=7382&rsv_sug3=15&rsv_sug1=15&rsv_sug7=100&bs=js%E7%94%9F%E6%88%90%E4%BA%8C%E7%BB%B4%E7%A0%81";
Long2short(url);
}
运行后,我们可以看到控制台结果
------转换之前的reqUrl=http://980.so/api.php?url=https%3A%2F%2Fwww.baidu.com%2Fs%3Fie%3Dutf-8%26f%3D3%26rsv_bp%3D1%26tn%3Dmonline_dg%26wd%3D980.so%26oq%3Djs%25E7%2594%259F%25E6%2588%2590%25E4%25BA%258C%25E7%25BB%25B4%25E7%25A0%2581%26rsv_pq%3D9f72e3720004d0d6%26rsv_t%3D4723nWbFLUDh%252BxsJxCGBAJ%252BIyt%252F3OrwBNiGnGzQOpohNKYSqP9%252FbfPxFd9RIHq9s6A%26rqlang%3Dcn%26rsv_enter%3D1%26inputT%3D7382%26rsv_sug3%3D15%26rsv_sug1%3D15%26rsv_sug7%3D100%26bs%3Djs%25E7%2594%259F%25E6%2588%2590%25E4%25BA%258C%25E7%25BB%25B4%25E7%25A0%2581
------转换之后的url=http://980.so/31pVn4从结果,我们可以看出效果。这时候你可以吧转换之后的url复制到浏览器地址栏看看效果了,是不是一样的咯~
今天到此了,后续……
1、java代码生产二维码。
具体实现如下:
import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Shape; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.OutputStream; import java.util.Hashtable; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import com.google.zxing.DecodeHintType; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatReader; import com.google.zxing.MultiFormatWriter; import com.google.zxing.Result; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** * * @author **** * */ public class QRCodeUtil { private static final String CHARSET = "utf-8"; private static final String FORMAT_NAME = "png"; // 二维码尺寸 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 hints = new Hashtable(); 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(); } /** * * @param content 二维码内容 * @param imgPath 读取图片路径 放到二维码中间 * @param destPath 存放图片路径 * @param needCompress * @throws Exception */ 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)+".png"; //String file = "qrcode.png";//生成二维码的图片 // ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file)); ImageIO.write(image, FORMAT_NAME, new File(destPath)); } public static void mkdirs(String destPath) { File file =new File(destPath); //当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常) if (!file.exists() && !file.isDirectory()) { file.mkdirs(); } } public static void encode(String content, String imgPath, String destPath) throws Exception { QRCodeUtil.encode(content, imgPath, destPath, false); } public static void encode(String content, String destPath, boolean needCompress) throws Exception { QRCodeUtil.encode(content, null, destPath, needCompress); } public static void encode(String content, String destPath) throws Exception { QRCodeUtil.encode(content, null, destPath, false); } 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); } public static void encode(String content, OutputStream output) throws Exception { QRCodeUtil.encode(content, null, output, false); } 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 hints = new Hashtable(); hints.put(DecodeHintType.CHARACTER_SET, CHARSET); result = new MultiFormatReader().decode(bitmap, hints); String resultStr = result.getText(); return resultStr; } 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://blog.csdn.net/tb176"; //下面读取和生产图片路径自己设置 QRCodeUtil.encode(text, "C:\\Users\\****\\Desktop\\qrcode\\share-wx.png", "C:\\Users\\****\\Desktop\\qrcode\\qrcode.png", true); } }
辅助类如下:
import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import com.google.zxing.LuminanceSource; /** * * @author **** * */ public class BufferedImageLuminanceSource extends LuminanceSource { private final BufferedImage image; private final int left; private final int top; public BufferedImageLuminanceSource(BufferedImage image) { this(image, 0, 0, image.getWidth(), image.getHeight()); } public BufferedImageLuminanceSource(BufferedImage image, int left, int top, int width, int height) { super(width, height); int sourceWidth = image.getWidth(); int sourceHeight = image.getHeight(); if (left + width > sourceWidth || top + height > sourceHeight) { throw new IllegalArgumentException( "Crop rectangle does not fit within image data."); } for (int y = top; y < top + height; y++) { for (int x = left; x < left + width; x++) { if ((image.getRGB(x, y) & 0xFF000000) == 0) { image.setRGB(x, y, 0xFFFFFFFF); // = white } } } this.image = new BufferedImage(sourceWidth, sourceHeight, BufferedImage.TYPE_BYTE_GRAY); this.image.getGraphics().drawImage(image, 0, 0, null); this.left = left; this.top = top; } public byte[] getRow(int y, byte[] row) { if (y < 0 || y >= getHeight()) { throw new IllegalArgumentException( "Requested row is outside the image: " + y); } int width = getWidth(); if (row == null || row.length < width) { row = new byte[width]; } image.getRaster().getDataElements(left, top + y, width, 1, row); return row; } public byte[] getMatrix() { int width = getWidth(); int height = getHeight(); int area = width * height; byte[] matrix = new byte[area]; image.getRaster().getDataElements(left, top, width, height, matrix); return matrix; } public boolean isCropSupported() { return true; } public LuminanceSource crop(int left, int top, int width, int height) { return new BufferedImageLuminanceSource(image, this.left + left, this.top + top, width, height); } public boolean isRotateSupported() { return true; } public LuminanceSource rotateCounterClockwise() { int sourceWidth = image.getWidth(); int sourceHeight = image.getHeight(); AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 0.0, 0.0, sourceWidth); BufferedImage rotatedImage = new BufferedImage(sourceHeight, sourceWidth, BufferedImage.TYPE_BYTE_GRAY); Graphics2D g = rotatedImage.createGraphics(); g.drawImage(image, transform, null); g.dispose(); int width = getWidth(); return new BufferedImageLuminanceSource(rotatedImage, top, sourceWidth - (left + width), getHeight(), width); } }
以上是简单java实现二维码的生产,你可以通过扫描来查看是不是你想要的,下面来看下前段js怎么生成二维码的,这里我把工具改为WebStorm这样我们不需要每次都启动tomcat服了,它直接集成了这些功能,方便一些纯前端开发。最好参考《点击打开链接》因为这里说的太简单明了了。
接下来是关于文本内容过长导致二维码识别度降低的问题,我们这是会选择吧长链接转为短链接,具体可以参考《点击打开链接》下面是个人的测试案例
public static String Long2short(String url) throws IOException{
//生成短连接
String reqUrl = "http://980.so/api.php?url="+ URLEncoder.encode(url,"UTF-8");
logger.info("------转换之前的reqUrl="+reqUrl);
Map<String,String> map = new HashMap<String,String>();
String tinyUrl = GetRequest.getRequest(reqUrl,map);//http请求
if(tinyUrl != null && tinyUrl.startsWith("http://980.so/"))
{
url = tinyUrl;
}
logger.info("------转换之后的url="+url);
return url;
}
主函数也贴出来吧
public static void main(String[] args) throws IOException {
String url = "https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=monline_dg&wd=980.so&oq=js%E7%94%9F%E6%88%90%E4%BA%8C%E7%BB%B4%E7%A0%81&rsv_pq=9f72e3720004d0d6&rsv_t=4723nWbFLUDh%2BxsJxCGBAJ%2BIyt%2F3OrwBNiGnGzQOpohNKYSqP9%2FbfPxFd9RIHq9s6A&rqlang=cn&rsv_enter=1&inputT=7382&rsv_sug3=15&rsv_sug1=15&rsv_sug7=100&bs=js%E7%94%9F%E6%88%90%E4%BA%8C%E7%BB%B4%E7%A0%81";
Long2short(url);
}
运行后,我们可以看到控制台结果
------转换之前的reqUrl=http://980.so/api.php?url=https%3A%2F%2Fwww.baidu.com%2Fs%3Fie%3Dutf-8%26f%3D3%26rsv_bp%3D1%26tn%3Dmonline_dg%26wd%3D980.so%26oq%3Djs%25E7%2594%259F%25E6%2588%2590%25E4%25BA%258C%25E7%25BB%25B4%25E7%25A0%2581%26rsv_pq%3D9f72e3720004d0d6%26rsv_t%3D4723nWbFLUDh%252BxsJxCGBAJ%252BIyt%252F3OrwBNiGnGzQOpohNKYSqP9%252FbfPxFd9RIHq9s6A%26rqlang%3Dcn%26rsv_enter%3D1%26inputT%3D7382%26rsv_sug3%3D15%26rsv_sug1%3D15%26rsv_sug7%3D100%26bs%3Djs%25E7%2594%259F%25E6%2588%2590%25E4%25BA%258C%25E7%25BB%25B4%25E7%25A0%2581
------转换之后的url=http://980.so/31pVn4从结果,我们可以看出效果。这时候你可以吧转换之后的url复制到浏览器地址栏看看效果了,是不是一样的咯~
今天到此了,后续……
相关文章推荐
- 招聘ASP.NET资深程序员[上海]
- 【上海】网络游戏公司招聘ASP.NET程序员
- 招牌net程序员(包吃住有电话,冰箱等)工作地点上海
- 程序员在上海拿多少钱够花,
- 上海程序员平均薪水达10950元/月
- 程序员在上海(9)
- 招聘.net高级程序员(上海)
- 在上海三年做了三年JAVA程序员,不堪回首
- 上海传智程序员携手设计狮美女雨中烧烤!!
- 程序员在上海(1)
- 程序员找工作经历,一个人在上海工作的艰辛
- 有多少上海的程序员, 大家约个时间出来聚聚
- 程序员在上海之一
- 程序员在上海之三
- 招聘c#程序员[上海]
- 一个会弹吉他的程序员在上海。
- 谁说程序员都是苦逼的——看看兄弟连上海S2班的点点滴滴
- [上海]招聘Asp.Net程序员
- 程序员在上海(2)
- 上海 招聘 asp.net jq 程序员