2012-11-24 30 views
7

मेरे पास बारकोड पर अतिरिक्त जानकारी प्रिंट करने से संबंधित एक प्रश्न है। मैं अपने बारकोड बनाने के लिए http://barbecue.sourceforge.net/ का उपयोग कर रहा हूं।ग्राफिक्स 2 डी टेक्स्ट गुणवत्ता को कैसे बढ़ाएं?

मेरे बारकोड बनाने के बाद मैं कुछ अतिरिक्त जानकारी जोड़ना चाहता हूं। फिलहाल मैं इसे निम्न तरीके से करता हूं! उदाहरण के लिए:

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

के रूप में आप देख सकते हैं अपने पाठ की गुणवत्ता (ऊपर और बारकोड से कम) है वास्तव में खराब है ... कैसे कर सकते हैं मैं पाठ को और अधिक आसान बनाने के लिए पाठ की गुणवत्ता में वृद्धि करता हूं और पिक्सलेटेड नहीं ?!

(जब मैं अपने बारकोड मुद्रित, बारकोड बहुत pixelated देखो ...)

किसी भी सुझाव दिए गए?

अद्यतन:

तो, मैं यहाँ एक तस्वीर मेरी नवीनतम परिणाम का जोड़ा ... जब मैं इन बारकोड प्रिंट आउट वे भयानक हैं!

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

कि कोड के साथ मैं सबसे अच्छे परिणाम प्राप्त: तो यहाँ कोड मैं क्या किया है! बेशक मैंने "मेट्रिक्स, एए_जीएसपीपी, एलसीएस_एचआरबीबी, विभिन्न फ़ॉन्ट्स (वर्डाना मेरी राय में सबसे अच्छा है) ..." और बहुत कुछ के साथ खेला, लेकिन उनमें से कुछ मैं उपयोग नहीं कर सका, क्योंकि तब मेरा बारकोड धुंधला हो गया! तो वास्तव में मैं समस्या को मजबूर कर रहा हूं कि मैं ग्राफिक्स 2 डी से ड्रॉस्ट्रिंग की अपनी टेक्स्ट-गुणवत्ता की गुणवत्ता में सुधार करने में असमर्थ हूं!

तो, मैं पूछना चाहता हूं कि "एसएसवाईवाईएस" (फ़ॉन्ट आकार 11) और "फ्लोरेट" (फ़ॉन्ट आकार 7) को बहुत अच्छा दिखने की संभावना है या नहीं! क्या जावा में "12" से कम फ़ॉन्ट आकार वाले छवि पर "चिकनी" टेक्स्ट खींचने की संभावना है? क्या इसके लिए कोई कामकाज है? आप चित्र पत्र "एस और वाई" बहुत भयानक लग रही है ... में देख सकते हैं

2 अद्यतन:

कुछ उदाहरण कोड अब तक ... कृपया सुनिश्चित करें कि निम्न फ़ोल्डर मौजूद हो: 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 दिनों में खेला ... लेकिन मैं इसे प्रबंधित नहीं कर सका ... यह बहुत पिक्सेल है !! क्या टेक्स्ट की गुणवत्ता बढ़ाने का कोई और मौका है? ग्राफिक्स 2 डी से कुछ और? या जावा इतने छोटे फ़ॉन्ट आकार के साथ सौदा नहीं कर सकते हैं? मैंने अपनी पोस्ट अपडेट की है कि आप देख सकते हैं कि अब तक मेरे पास क्या है, लेकिन "एसएसवाईवाईएस" (फ़ॉन्ट आकार 13 भी बहुत पिक्सलेटेड है) ... – Sway

+0

सहायता का अगला स्तर। बेहतर सहायता के लिए जल्द ही, एक [एसएससीसीई] (http://sscce.org/) पोस्ट करें। –

उत्तर

2

किसी ऐसे मामलों में पिक्सेल छवियों, और नहीं वेक्टर का उपयोग करना चाहता है, तो छवि बेहतर मुद्रण गुणवत्ता के लिए upscaled किया जाना चाहिए:

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 परिवर्तित कर सकते हैं: साधारण प्रदर्शन के साथ वेब पृष्ठों पर छवियों के लिए 1x का उपयोग करें, रेटिना डिस्प्ले के लिए 2x और 4x मुद्रण के लिए!

+0

PIXELS_PER_POINT को डबल टाइप करने की आवश्यकता नहीं है, जैसे कि PIXELS_PER_POINT = 300./90। एक 300 डीपीआई प्रिंट के लिए (मानक मॉनीटर मानते हैं 90 डीपीआई) PIXELS_PER_POINT = 600./90। 600 डीपीआई प्रिंट के लिए ... और इसी तरह – alfonx

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^