2012-04-27 80 views
2

我目前正在使用ZXing生成QR码作为图像的应用程序。下面是一个简单的例子:使用Java将QR代码生成为可缩放的EPS

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import com.google.zxing.BarcodeFormat; 
import com.google.zxing.MultiFormatWriter; 
import com.google.zxing.WriterException; 
import com.google.zxing.client.j2se.MatrixToImageWriter; 
import com.google.zxing.common.BitMatrix; 

public class MyQREncoder { 

    /** 
    * @param args 
    * @throws WriterException 
    * @throws IOException 
    * @throws FileNotFoundException 
    */ 
    public static void main(String[] args) throws WriterException, FileNotFoundException, IOException { 
     String text = "Some text to encode"; 
     int width = 300; 
     int height = 300; 
     BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE,width,height); 
     String file = "plop.png"; 
     String format = "png"; 
     MatrixToImageWriter.writeToStream(bitMatrix, format, new FileOutputStream(new File(file))); 
    } 

} 

这产生了擦写QRCODE说:“一些文本编码”的PNG文件。

我的问题是,如果我尝试将格式更改为eps,那么我会得到一个空文件。目前我们使用的解决方案是通过imagemagick转换实用程序将png文件转换为eps。但是,给定的EPS只是嵌入原始图像,并且不能很好地缩放(特别是在打印时)。

是否有人知道是否有任何开源解决方案(使用Zxing或其他)来构建可扩展Eps文件? (或例如任何矢量格式)

回答

3

编辑:这是在Java中一个完整的工作方案:约刚刚生成的PS文件自己

PrintStream psFile = /* Open file */; 

final int blockSize = 4; 

psFile.println("%!PS-Adobe-3.0 EPSF-3.0"); 
psFile.println("%%BoundingBox: 0 0 " + bitMatrix.getWidth() * blockSize + " " + bitMatrix.getHeight() * blockSize); 

psFile.print("/bits ["); 
for(int y = 0; y < bitMatrix.getHeight(); ++y) { 
    for(int x = 0; x < bitMatrix.getWidth(); ++x) { 
     psFile.print(bitMatrix.get(x, y) ? "1 " : "0 "); 
    }   
} 
psFile.println("] def"); 

psFile.println("/width " + bitMatrix.getWidth() + " def"); 
psFile.println("/height " + bitMatrix.getHeight() + " def"); 

psFile.println(
     "/y 0 def\n" + 
     blockSize + " " + blockSize + " scale\n" + 
     "height {\n" + 
     " /x 0 def\n" + 
     " width {\n" + 
     "  bits y width mul x add get 1 eq {\n" + 
     "   newpath\n" + 
     "   x y moveto\n" + 
     "   0 1 rlineto\n" + 
     "   1 0 rlineto\n" + 
     "   0 -1 rlineto\n" + 
     "   closepath\n" + 
     "   fill\n" + 
     "  } if\n" + 
     "  /x x 1 add def\n" + 
     " } repeat\n" + 
     " /y y 1 add def\n" + 
     "} repeat\n"); 
psFile.close(); 

什么?事情是这样的:

%!PS-Adobe-3.0 EPSF-3.0 
%%BoundingBox: 0 0 288 288 

/bits [0 0 1 0 1 0 1 1 0 1 1 0 1 1 0 0] def 

/width 4 def 
/height 4 def 
/y 0 def 

72 72 scale 

height { 
    /x 0 def 
    width { 
     bits y width mul x add get 1 eq { 
     newpath 
     x y moveto 
     0 1 rlineto 
     1 0 rlineto 
     0 -1 rlineto 
     closepath 
     fill 
     } if 
     /x x 1 add def 
    } repeat 
    /y y 1 add def 
} repeat 

(如果你当然会在与自己的价值观上填写DEFS,通过BitMatrix迭代和打印1和0的填写bitsps file output

+0

听起来很很好,非常感谢。但在使用之前,我必须将我的BitMatrix缩小到像素大小。不错,我会试一试。 ;) – Nicocube 2012-04-28 15:06:39