gpt4 book ai didi

java - 如何提高 Graphics2D 文本质量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:34:40 24 4
gpt4 key购买 nike

我有一个关于在条形码上打印附加信息的问题。我正在使用 http://barbecue.sourceforge.net/创建我的条形码。

创建条形码后,我想添加一些附加信息。目前我用以下方式做到这一点!例如:

Graphics2D g2d5 = container4Barcode.createGraphics();
g2d5.setBackground(Color.WHITE);
g2d5.clearRect(0, 33, 200, 200);
g2d5.setColor(Color.BLACK);
g2d5.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d5.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
g2d5.setFont(new Font("Arial", Font.PLAIN, 8));
g2d5.drawString(barcode, 8, 40);
g2d5.drawString(generateRandomNumber(ekPreis), 57, 40);
String datumResult = datum;
g2d5.drawString(location, 98, 40);
g2d5.drawString(datum.substring(2), 114, 40);
g2d5.dispose();

输出为 pdf 格式,如下所示: enter image description here

如您所见,我的文本(条形码上方和下方)的质量真的很差......我怎样才能提高文本的质量以使文本更平滑而不是像素化?!

(当我打印条形码时,条形码看起来非常像素化......)

有什么建议吗?

更新:

所以,我在这里添加了一张我最新结果的图片……当我打印出这些条形码时,它们看起来很糟糕!所以这是我所做的代码:

Graphics2D g2d6 = container4Barcode.createGraphics();
g2d6.setColor(Color.black);
g2d6.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d6.setFont(new Font("Verdana", Font.BOLD, 7));
g2d6.drawString("FLORETT", 9, 20);
g2d6.drawString("50-521-60", 57, 20);
Graphics2D g2d4 = container4Barcode.createGraphics();
g2d4.setColor(Color.black);
g2d4.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d4.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d4.setFont(new Font("Verdana", Font.BOLD, 11));
g2d4.drawString("SSYYS", 105, 19);
g2d4.dispose();

有了那个代码,我得到了最好的结果!当然,我玩过“Metrics、AA_GASP、LCS_HRGB、不同的字体(我认为 Verdana 是最好的)……”等等,但其中一些我无法使用,因为那时我的条形码变得模糊了!所以我实际上是在强制这个问题,我无法提高 graphics2d 拉绳的文本质量!

所以,我想请问有没有可能让“SSYYS”(字体大小11)和“FLORETT”(字体大小7)看起来更好看! JAVA 是否有可能在字体大小小于“12”的图像上绘制“平滑”文本?有解决方法吗?正如你在图片中看到的那样,字母“S 和 Y”看起来非常糟糕......

第二次更新:

到目前为止的一些示例代码...请确保以下文件夹存在:C:\TestBarcodes\

希望我将我的代码减少到你能想象到我的问题所在的最低限度......

package generator;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;

import net.sourceforge.barbecue.Barcode;
import net.sourceforge.barbecue.BarcodeException;
import net.sourceforge.barbecue.BarcodeFactory;
import net.sourceforge.barbecue.output.OutputException;

import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;

public class BarcodeGen {

// sets the picWidth
private static int picWidth = 149;
// sets the picHeigth
private static int picHeigth = 60;

public static void main(String[] args)
throws BarcodeException, OutputException, COSVisitorException, IOException {
generateBarcode("11138500");
}

public static void generateBarcode(String barcode)
throws IOException, COSVisitorException, BarcodeException, OutputException {

Barcode barcode2 = BarcodeFactory.createCode39(barcode, false);
int gw = barcode2.getWidth();
// change this to suit if you want higher, default 50
// barcode2.setBarWidth(50);
// this sets DPI
barcode2.setResolution(100);
// barcode2.setFont(font);
int gh = barcode2.getHeight();
// change this if you want a coloured background
// image = new BufferedImage(t, s, BufferedImage.TYPE_INT_RGB)
BufferedImage image = new BufferedImage(gw, gh, BufferedImage.TYPE_INT_RGB);

Graphics2D g2 = (Graphics2D) image.getGraphics();
// default is black so draw a white box first
// change type to INT_RGB if you want a coloured background
g2.setColor(Color.white);
g2.fillRect(0, 0, gw, gh);
barcode2.draw(g2, 0, 0);

// CREATE ADDITIONAL INFORMATION ON BARCODE

BufferedImage container4Barcode = new BufferedImage(
picWidth, picHeigth, image.getType());
Graphics2D g2d = container4Barcode.createGraphics();

g2d.setBackground(Color.WHITE);
g2d.clearRect(0, 0, picWidth, picHeigth);
g2d.setColor(Color.black);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
g2d.drawImage(image, 8, 21, 130, 18, null);
g2d.dispose();

Graphics2D g2d6 = container4Barcode.createGraphics();
g2d6.setColor(Color.black);
g2d6.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d6.setFont(new Font("Verdana", Font.BOLD, 7));

g2d6.drawString("FLORETT", 9, 20);
g2d6.drawString("50-521-60", 57, 20);

Graphics2D g2d4 = container4Barcode.createGraphics();
g2d4.setColor(Color.black);
g2d4.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d4.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d4.setFont(new Font("Verdana", Font.BOLD, 11));
g2d4.drawString("SSYYS", 105, 19);
g2d4.dispose();

// PRINT PDF

int ver = 782;

PDDocument doc = new PDDocument();
PDPage page = new PDPage(PDPage.PAGE_SIZE_A4);
doc.addPage(page);

PDXObjectImage image2 = new PDJpeg(doc, container4Barcode);
PDPageContentStream content = new PDPageContentStream(doc, page);
content.drawImage(image2, 5, ver);
content.close();

doc.save(new FileOutputStream("C:\\TestBarcodes\\barcode.pdf"));

// opens the pdf file
Process p = Runtime
.getRuntime()
.exec("rundll32 url.dll,FileProtocolHandler C:\\TestBarcodes\\barcode.pdf");
try {
p.waitFor();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

enter image description here

最佳答案

如果有人想在这种情况下使用像素图像而不是 vector 图像,则图像应该放大以获得更好的打印质量:

static final int PIXELS_PER_POINT = 4; // 4x

然后定义所有尺寸以点为单位,而不是以像素为单位:

// Image size in points
static final int IMAGE_WIDTH = 150;
static final int IMAGE_HEIGHT = 60;
// Font size in points
static final int FONT_SIZE = 11;

现在,在进行任何绘图时,始终使用转换为像素的点:

static int toPixels(int value) {
return value * PIXELS_PER_POINT;
}

BufferedImage draw() {
BufferedImage image =
new BufferedImage(toPixels(IMAGE_WIDTH), toPixels(IMAGE_HEIGHT), TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();
// <graphics init code goes here>

Font font = new Font("Arial", Font.PLAIN, toPixels(FONT_SIZE));
g.setFont(font);
g.drawString("Grapes", toPixels(5), toPixels(40)); // coordinates are in points

g.dispose()
return image;
}

因此,通过这种方法,您可以使用“标准”维度进行操作。对于低复杂度和中等复杂度的绘图,这种方法对我来说非常有效。

您可以更进一步,将 PIXELS_PER_POINT 转换为参数:使用 1x 用于普通显示网页上的图像,2x 用于 Retina显示和 4x 用于打印!

关于java - 如何提高 Graphics2D 文本质量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13541351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com