我现在有这个课程,它会创建一个带有QR码的图像,效果很好。 然而,当我使用这个类创建另一个QR码时,通过用新的String提供它,第一个QR码被绘制...... 请帮忙! 有没有办法初始化Graphics2d或BufferedImage?
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
public class QRCodeGenerator {
int size = 300;
String fileType = "jpg";
static String filePath = "QR.jpg";
static File myFile = new File(filePath);
Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix byteMatrix = new BitMatrix(300, 300);
BufferedImage image;
Graphics2D graphics;
QRCodeGenerator(String myText) {
try {
hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
byteMatrix = qrCodeWriter.encode(myText, BarcodeFormat.QR_CODE,
size, size, hintMap);
int width = byteMatrix.getWidth();
image = new BufferedImage(width, width, BufferedImage.TYPE_INT_RGB);
image.createGraphics();
graphics = (Graphics2D) image.getGraphics();
graphics.setColor(ColorsClass.colorBackground);
graphics.fillRect(0, 0, width, width);
graphics.setColor(ColorsClass.colorForeground);
for (int i = 0; i < width; i++) {
for (int j = 0; j < width; j++) {
if (byteMatrix.get(i, j)) {
graphics.fillRect(i, j, 1, 1);
}
}
}
ImageIO.write(image, fileType, myFile);
System.out.println(myText);
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
它似乎是myFile字段声明或您需要编写的图像文件的问题。
如下面的链接所示。您必须每次都明确关闭并打开图像文件
每次想要创建2D图像时,您都可以尝试创建一个具有不同名称的新文件,例如&#34; QR_1.jpg&#34;,&#34; QR_2.jpg&#34;从而减少了覆盖和丢失先前数据的可能性。
http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html
使用支持给定格式的任意ImageWriter将图像写入ImageOutputStream。图像从当前流指针开始写入ImageOutputStream,从该点向前覆盖现有流数据(如果存在)。
写入操作完成后,此方法不会关闭提供的ImageOutputStream;如果需要,调用者有责任关闭流。