2012-05-28 4 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 

같은이가 좀 긴 내용으로이 코드를 테스트하고 최대 600 문자와 함께 일

작동하지 않습니다 SVG

convert qr-code.pdf qr-code.svg 

에 대해 수행 할 수 없습니다. 이것은 아마 전화 나 화면의 카메라의 정밀도에 달려 있습니다.

가 나는 ZXingJFreeSVG (http://www.jfree.org/jfreesvg)에, 예를 들어 연결하는 아주 쉽게 ... 이것이 내가 아는 사람

+0

UTF-8이 필요하지 않으면 ByteBuffer와 힌트를 생략하고 문자열을 직접 인코딩 할 수 있습니다. –

+1

개인적으로 [inkscape tracing]을 사용합니다 (http://inkscape.org/doc /tracing/tutorial-tracing.html)을 PNG에 추가하면됩니다. 그러나이 대답이 효과가 있다면 그것을 사용할 수 있습니다. – comp500

7

오래된 질문을하지만이 작업을 수행하는 방법을 찾고 함께 오는 사람에 대한 희망 :

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()); 
    } 

}