java bufferedImage 生成图片质量很差,图片局部细微锯齿化很严重.

movi127 2017-06-09 03:57:49
小弟最近在做演出票打印工作.利用java中bufferedImage生成图片,但是图片质量不是很高,局部字体很严重,我该怎么处理?提高图片分辨率可以么?望各位大神给出建议,,不胜感激
public static BufferedImage generatePictrue(TicketFaceClass ticketFaceClass, TicketInfo ticketInfo) throws WriterException, IOException {
TicketFace ticketFace = ticketFaceClass.getTicketFace();
int height = ticketFace.getTicketHeight();
int width = ticketFace.getTicketWidth();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);
Graphics2D graphics = image.createGraphics();

// 初始化画笔
PrinterImage.initGraphics(graphics, width, height);

// 画附券的分割线,及附券
for (int i= 1 ;i <= ticketFace.getSubQuantity();i++){
if(ticketFace.getSubAtleft()){
// graphics.drawLine(ticketFace.getSubWidth()*i,0,ticketFace.getSubWidth()*i,
// ticketFace.getTicketHeight());
}else{
// graphics.drawLine(ticketFace.getTicketWidth()-ticketFace.getSubWidth()*i,0,
// ticketFace.getTicketWidth()-ticketFace.getSubWidth()*i,ticketFace.getTicketHeight());
}
}

for (int i = 0; i <= ticketFaceClass.getTicketElementList().size() - 1; i++) {
TicketElement ticketElementShow = ticketFaceClass.getTicketElementList().get(i);
String elementType = ticketElementShow.getElementType();
// 判读元素的类型,如果是图片类型,绘图.这里图片有个宽度和长度最小值问题.这里图片维护还没有做.
if (elementType.equalsIgnoreCase(IMAGE_TYPE)|| elementType.equalsIgnoreCase(IMAGE_TYPE1)) {
//// String picPath = ticketElementShow.getPath(); // 数据库中Path 还没有定义好.这里怎么处理?
// File imageFile = new File("E://temp//二维码.jpg");
// BufferedImage srcImage = null;
// srcImage = ImageIO.read(imageFile);
//
// int srcWidth = srcImage.getWidth();
//
// int srcHeight = srcImage.getHeight();
//
// double scale = getScale(srcWidth,srcHeight,ticketElementShow.getEleWidth(),ticketElementShow.getEleHeight());
//
// int newWidth = (int) (srcWidth*scale);
//
// int newHeight = (int) (srcHeight*scale);
//
// graphics.drawImage(srcImage.getScaledInstance(newWidth,newHeight,Image.SCALE_SMOOTH),
// ticketElementShow.getEleLef(),ticketElementShow.getEleTop(),null);
}

// 如果类型是二维图片
if (elementType.equalsIgnoreCase(IMAGE_TYPE2) || elementType.equalsIgnoreCase(IMAGE_TYPE3))
{
BitMatrix bitMatrix = defineBitMatrix(ticketElementShow.getCaption(),
ticketElementShow.getEleWidth(),ticketElementShow.getEleHeight(),elementType);
int[] rec = bitMatrix.getEnclosingRectangle();
for (int n =0; n <= rec.length-1;n++)
{
System.out.println(Thread.currentThread().getStackTrace()[1].getClassName() +":"+
Thread.currentThread().getStackTrace()[1].getMethodName()+" "+rec[n]+"---------");
}
int resWidth = rec[2] + 1; // 新的二维码x
int resHeight = rec[3] + 1; // 新的二维码y
BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);

resMatrix.clear();
for (int i1 = 0; i1 < resWidth; i1++) {
for (int j = 0; j < resHeight; j++) {
if (bitMatrix.get(i1 + rec[0], j + rec[1])) {
resMatrix.set(i1, j);
}
}
}

drawQRCode(image,ticketElementShow.getEleWidth(),ticketElementShow.getEleHeight(),
ticketElementShow.getEleLef(),ticketElementShow.getEleTop(),bitMatrix);
}
//元素是普通文本或者来自数据库字段类型
if (ticketElementShow.getElementType().equalsIgnoreCase(TEXT_TYPE1) ||
ticketElementShow.getElementType().equalsIgnoreCase(TEXT_TYPE) ){
// 根据字体名称,大小,字体格式定义字体
// Font font = LoadLocalFont("E:/temp/ttf/FZLTZH_GBK_GBK.TTF"); // 方正兰亭中黑

Font font = LoadLocalFont(getFontFilePath(ticketElementShow.getFontName()));
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// graphics.setFont(font);
graphics.setFont(getFormatFont(font,ticketElementShow));
// 要打印内容的x坐标
int xPose = PrinterImage.getFontLocaltion(ticketElementShow, graphics, font).getX();
// 要打印内容的y坐标
int yPose = PrinterImage.getFontLocaltion(ticketElementShow, graphics, font).getY();

graphics.drawString(ticketElementShow.getCaption(), xPose, yPose);
}


}
// drawNetLine(graphics,ticketFace);
return image;
}
...全文
1094 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧