2012-11-24 8 views
7

Ich habe eine Frage zum Drucken zusätzlicher Informationen über Barcodes. Ich verwende http://barbecue.sourceforge.net/, um meine Barcodes zu erstellen.Wie kann Graphics2D Textqualität erhöht werden?

Nachdem ich meine Barcodes erstellt habe, möchte ich einige zusätzliche Informationen hinzufügen. Im Moment mache ich das auf folgende Weise! Zum Beispiel: die folgenden

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(); 

Der Ausgang ist in einem pdf: enter image description here

Wie Sie sehen können, ist die Qualität meines Textes (über und unter dem Barcode) ist wirklich schlecht ... Wie kann Ich erhöhe die Qualität des Textes, um den Text glatter und nicht pixelig zu machen ?!

(Wenn ich meine Barcodes gedruckt werden, sehen die Barcodes sehr pixelig ...)

Irgendwelche Tipps?

UPDATE:

Also, ich ein Bild von meinem neuesten Ergebnisse hier hinzugefügt ... Wenn ich diese Barcodes ausdrucken, sie sehen schrecklich! Also hier ist der Code, was ich getan habe:

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(); 

Mit diesem Code bekomme ich die besten Ergebnisse! Natürlich habe ich mit "Metrics, AA_GASP, LCS_HRGB, verschiedenen Schriftarten (Verdana ist meiner Meinung nach die beste)" und vielem mehr gespielt, aber einige davon konnte ich nicht verwenden, weil dann mein Barcode verschwommen wurde! So forciert ich das Problem, dass ich die Qualität meiner Text-Qualität des Drawstrings von graphics2d nicht verbessern kann!

Also, ich möchte fragen, ob es eine Möglichkeit gibt, die "SSYYS" (Schriftgröße 11) und die "FLORETT" (Schriftgröße 7) viel schöner aussehen zu lassen! Gibt es eine Möglichkeit in JAVA, "glatten" Text auf ein Bild mit einer Schriftgröße kleiner als "12" zu zeichnen? Gibt es einen Workaround dafür? Wie Sie die Buchstaben „S und Y“ sehr schrecklich aussehen in dem Bild sehen kann ...

2. Update:

Einige Beispiel-Code so weit ... Bitte stellen Sie sicher, dass der folgende Ordner vorhanden ist: C: \ TestBarcodes \

Hoffe, dass ich meinen Code auf ein Minimum reduziert, die man sich vorstellen kann, was mein Problem ist ...

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

Experimentieren Sie einfach mit den Möglichkeiten, indem Sie den Code auf [diese Antwort] verwenden (http://stackoverflow.com/questions/5995798/java-text-on-image/5998015#5998015). –

+0

Vielen Dank für Ihren Beitrag, aber das hat nicht geholfen:/Ich habe die letzten 5 Tage gespielt, um die Qualität des Textes zu verbessern ... ABER ich habe es nicht geschafft ... Es ist sehr pixelig !! Gibt es eine weitere Möglichkeit, die Qualität des Textes zu erhöhen? Etwas anderes als Graphics2D? Oder kann Java mit so einer kleinen Schriftgröße nicht umgehen? Ich habe meinen Beitrag aktualisiert, dass Sie sehen können, was ich bis jetzt habe, aber sogar die "SSYYS" (Schriftgröße 13 ist sehr pixelig) ... – Sway

+0

Nächste Ebene der Hilfe. Um schneller Hilfe zu bekommen, schreiben Sie eine [SSCCE] (http://sscce.org/). –

Antwort

2

Wenn jemand will, Pixelbilder in solchen Fällen verwenden, und nicht Vektor, dann Bild sollte für bessere Druckqualität Upscaling:

static final int PIXELS_PER_POINT = 4; // 4x 

Dann werden alle Dimensionen in Punkten definieren, nicht in Pixel:

// 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; 

wenn nun jede Zeichnung tun, immer Punkte zu Pixel umgewandelt verwenden:

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; 
} 

Mit diesem Ansatz können Sie also mit "Standard" -Messungen arbeiten.Dieser Ansatz funktioniert bei Zeichnungen mit niedriger und mittlerer Komplexität sehr gut.

können Sie noch weiter gehen und konvertieren PIXELS_PER_POINT auf einen Parameter: Verwenden Sie 1x für Bilder auf Web-Seiten mit normalen Display, 2x für Retina-Displays und 4x für den Druck!

+0

Sollte PIXELS_PER_POINT nicht vom Typ double sein, berechnet durch etwas wie: PIXELS_PER_POINT = 300./90. für einen 300 dpi-Druck (vorausgesetzt, Standardmonitore haben 90 dpi) PIXELS_PER_POINT = 600./90. für einen 600dpi Print ... und so weiter – alfonx