2012-11-24 19 views
7

バーコードに関する追加情報の印刷に関する質問があります。バーコードを作成するのにhttp://barbecue.sourceforge.net/を使用しています。Graphics2Dのテキストの品質を上げるには?

バーコードを作成した後、追加情報を追加したいと思います。現時点で私は次の方法でこれを行います!たとえば、次のように

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

あなたが見ることができるように(バーコードの上記および下)私のテキストの品質は本当に悪いです...どのようにすることができますテキストをよりスムーズにし、ピクセル化しないように、テキストの品質を上げますか?

(私は私のバーコードを印刷する場合、バーコードは非常にピクセル化に見える...)

任意のヒント?

UPDATE:

だから私は、彼らが恐ろしい見えるこれらのバーコードを印刷するとき、私は...ここに私の最新の成果の写真を追加しました!だからここに私がしたコード:

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は私の意見では最高です)..."といっしょに演奏しましたが、そのうちいくつかは使用できませんでした。なぜなら私のバーコードがぼやけてしまったからです!私はグラフィックス2のドローストリングのテキスト品質を向上させることができません。

「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

+2

[この回答](http://stackoverflow.com/questions/5995798/java-text-on-image/5998015#5998015)のコードを使用して、簡単に可能性を試してみてください。 –

+0

あなたのポストに感謝しますが、これは助けになりませんでした:/私はテキストの品質を向上させるために最後の5日間演奏しました...しかし、私はそれを管理することができませんでした...それは非常にpixelatedです!テキストの品質を向上させる別の機会はありますか? Graphics2D以外の何か?または、そのような小さなフォントサイズでJavaを扱うことはできませんか?私は私が今まで持っているものを見ることができるように自分の投稿を更新しましたが、 "SSYYS"(フォントサイズ13は非常にピクセル化されています)... – Sway

+0

次のレベルのヘルプ。もっと早く助けを求めるには、[SSCCE](http://sscce.org/)を投稿してください。 –

答えて

2

誰かがその後画像がより良い印刷品質ををアップスケールされるべきである、ベクター、このような場合にはピクセル画像を使用したい、としない場合:

static final int PIXELS_PER_POINT = 4; // 4x 

そして点ではなく、画素内のすべてのディメンションを定義するには

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; 
} 
:今、常にピクセルに変換ポイントを使用して、任意の描画を行う際に
// 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; 

このアプローチでは、「標準的な」次元で操作できます。このアプローチは、複雑さの低い中程度の図面ではかなりうまく機能します。

あなたはさらに行くと、パラメータにPIXELS_PER_POINTを変換することができます:印刷のために、通常のディスプレイでのRetinaディスプレイ用2x4xをウェブページ上の画像のための1xを使用します!

+0

PIXELS_PER_POINTはdouble型でなければならない.PIXELS_PER_POINT = 300./90のように計算される。 300dpiプリントの場合(標準のモニタが90dpiを持つと仮定) PIXELS_PER_POINT = 600./90。 600dpiプリント用など... – alfonx

関連する問題