2012-05-28 67 views
2

我可以使用ZXing成功创建QR码PNG图像,但没有简单的方法将输出作为SVG或EPS。在矢量图像中创建QR码

如何从由QRCodeWriter创建的BitMatrix对象创建矢量图像?

+0

我会质疑你对矢量格式的需求。 QR码是一组完美的正方形黑白像素。它将扩大无限,而不会失去任何保真度。 所以,我想说,保存为PNG。 –

+2

这个世界上还有设备无法处理PNG。激光雕刻机就是其中之一。这就是为什么我需要一个矢量格式 –

回答

1

我发现的最简单的方法是用iText创建PDF,然后将生成的PDF转换为EPS或SVG。这里是创建PDF的代码:

@Test 
    public void testQRtoPDF() throws WriterException, FileNotFoundException, DocumentException, UnsupportedEncodingException { 
     final int s = 600; 
     int r = 1; 

     Charset charset = Charset.forName("UTF-8"); 
     CharsetEncoder encoder = charset.newEncoder(); 
     byte[] b = null; 
     try { 
     // Convert a string to UTF-8 bytes in a ByteBuffer 
     ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(
        "1éöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùò1" + 
           "2éöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùò2" + 
           "3éöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùò3" + 
           "4éöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùò4" + 
           "5éöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùò5" + 
           "6éöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùò6")); 
     b = bbuf.array(); 
     } catch (CharacterCodingException e) { 
     System.out.println(e.getMessage()); 
     } 

     String content = new String(b, "UTF-8"); 
     QRCodeWriter qrCodeWriter = new QRCodeWriter(); 
     Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(2); 
     hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); 
     BitMatrix qrCode = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, s, s, hints); 

     Document doc = new Document(new Rectangle(s, s)); 
     PdfWriter pdfWriter = PdfWriter.getInstance(doc, new FileOutputStream("qr-code.pdf")); 
     doc.open(); 
     PdfContentByte contentByte = pdfWriter.getDirectContent(); 
     contentByte.setColorFill(BaseColor.BLACK); 

     boolean d = false; 
     for (int x = 0; x < qrCode.getWidth(); x += r) { 
     for (int y = 0; y < qrCode.getHeight(); y += r) { 
      if (qrCode.get(x, y)) { 
       contentByte.rectangle(x, s - y, r, r); 
       contentByte.fill(); 
       contentByte.stroke(); 
      } 
     } 
     } 

     doc.close(); 
    } 

然后我使用图像魔术进行转换。像这样:

convert qr-code.pdf qr-code.eps 

同样不能对SVG

convert qr-code.pdf qr-code.svg 

做到这不起作用

我测试此代码与一些长期的内容和它具有高达600个字符的工作。这可能低于手机或屏幕上相机的精确度。

我希望这可以帮助别人

+0

如果你不需要UTF-8,你可以省略ByteBuffer和提示,并直接编码你的字符串 –

+1

亲自我会使用[inkscape tracing](http://inkscape.org/doc /tracing/tutorial-tracing.html)来做到这一点,但如果这个答案有效,你可以使用它。 – comp500

7

老问题,我知道,但对于沿寻找如何做到这一点的人来......它很容易连接到ZXingJFreeSVGhttp://www.jfree.org/jfreesvg),例如:

package org.jfree.demo; 

import com.google.zxing.BarcodeFormat; 
import com.google.zxing.WriterException; 
import com.google.zxing.common.BitMatrix; 
import com.google.zxing.qrcode.QRCodeWriter; 
import java.awt.Color; 
import java.io.File; 
import java.io.IOException; 
import org.jfree.graphics2d.svg.SVGGraphics2D; 
import org.jfree.graphics2d.svg.SVGUtils; 

public class QRCodes { 

    public static void main(String[] args) throws WriterException, IOException { 
     QRCodeWriter qrCodeWriter = new QRCodeWriter(); 
     BitMatrix bitMatrix = qrCodeWriter.encode("http://www.jfree.org/jfreesvg", 
       BarcodeFormat.QR_CODE, 160, 160); 
     int w = bitMatrix.getWidth(); 
     SVGGraphics2D g2 = new SVGGraphics2D(w, w); 
     g2.setColor(Color.BLACK); 
    for (int xIndex = 0; xIndex < w; xIndex = xIndex + bitMatrix.getRowSize()) { 
     for (int yIndex = 0; yIndex < w; yIndex = yIndex + bitMatrix.getRowSize()) { 
      if (bitMatrix.get(xIndex, yIndex)) { 
       g2.fillRect(xIndex, yIndex, bitMatrix.getRowSize(), bitMatrix.getRowSize()); 

      } 
     } 
    } 

     SVGUtils.writeToSVG(new File("qrtest.svg"), g2.getSVGElement()); 
    } 

}