दिलचस्प पोस्ट
जावा विभाजन () विधि अंत में खाली तार स्ट्रिप्स? Android एमुलेटर पर रूट एक्सेस कैसे प्राप्त करें? कैसे jQuery में एक तत्व (छवि) को पुनः लोड / ताज़ा करें क्या "घातक त्रुटि: अनपेक्षित रूप से एक वैकल्पिक मूल्य अनवरोधित करते समय शून्य पाया" मतलब है? स्कैनर विधि को चार अक्षर प्राप्त करने के लिए करता है: img तत्वों पर काम नहीं करने से पहले? एक पृष्ठभूमि स्क्रिप्ट से सामग्री स्क्रिप्ट तक संदेश भेजना, फिर इंजेक्शन वाली स्क्रिप्ट के लिए "WaitForExit" पर लटका हुआ ProcessStartInfo? क्यूं कर? डीबी में छवियों को संग्रहीत करना – हाँ या ना? जावा में PrintWriter और फ़ाइल वर्गों का उपयोग कैसे करें? मैं कंसोल कैसे साफ़ कर सकता हूं सूरज क्यों होता है। Mesc.Unsafe अस्तित्व में है, और इसे वास्तविक दुनिया में कैसे इस्तेमाल किया जा सकता है? C # कंसोल अनुप्रयोग की कंसोल विंडो को छुपाएं / छिपाएं दूरस्थ होस्ट का आईपी पता प्राप्त करें जावा के यूनरी प्लस ऑपरेटर का क्या उद्देश्य है?

छवि पर जावा पाठ

मैं bufferedimage में एक छवि लोड कर रहा हूँ और फिर उस पर कुछ पाठ लिख रहा हूँ। मैं पाठ जोड़ने के बाद यह छवि धूमिल और पाठ विकृत बनाता है। मेरे पास टेक्सट ऐन्शियलिंग चालू है यह संलग्न के रूप में देखा जा सकता है।

यहां छवि विवरण दर्ज करें

वेब के समाधान से एकत्रित समाधान "छवि पर जावा पाठ"

आप पाठ की गुणवत्ता को रेंडरिंग संकेतों के साथ नियंत्रित करने में सक्षम होना चाहिए जो कि अन्य प्रतिक्रियाओं में दिखाए गए हैं। मुझे पता है कि यह काम करता है क्योंकि मैंने इसे बहुत कुछ किया है, इसलिए मुझे लगता है कि इस मामले में गुणवत्ता के कारण गिरावट का कारण होना चाहिए।

  1. आप छवि की गुणवत्ता की जांच कैसे करते हैं? क्या आप जनरेट किए गए बुफर्ड इमेज को सीधे अपने जावा एप्लिकेशन में एक स्क्रीन ग्राफ़िक्स में पेंट करते हैं या डिस्क पर सहेजते हैं, यानी जेपीईजी? अगर आप इसे डिस्क पर सहेजते हैं तो इसे पीएनजी 24 के रूप में सहेजने का प्रयास करें और जेपीईजी के रूप में नहीं। मुझे लगता है कि आपकी डेस्कटॉप स्क्रीन सच रंग (32 या 24 बिट्स रंग गहराई) में चल रही है, है ना?
  2. क्या आप निश्चित हैं कि छवि वास्तव में बफ़ेड़ेइज़ेज के रूप में बनाई गई है। टीईपीडीआईएनआरजीबी? यदि आपके कोड में बफर्ड इमेज के निर्माण पर आपका कोई नियंत्रण नहीं है, तो उसे एक नया बफर्ड इमेज TYPE_INT_RGB के साथ बनाने की कोशिश करें और उसे एक में पेंट करें और उसके बाद उसमें पाठ डालें।
  3. RenderingHints.KEY_DITHER को RenderingHints.VALUE_DITHER_DISABLE के लिए सेट करने का प्रयास करें (हालांकि यह सही रंग छवियों के लिए आवश्यक नहीं होना चाहिए)।

यदि यह अभी भी आपको कारण खोजने में मदद नहीं करता है तो कृपया कुछ और जानकारी (वीएम संस्करण, ऑपरेटिंग सिस्टम) और स्रोत कोड प्रदान करें। पाठ रेंडरिंग जेडीके 1.6 अपडेट 10 के साथ काफी अच्छी हो गई है, लेकिन इससे पहले के रिलीज़ छवियों में साफ टेक्स्ट का उत्पादन करने में सक्षम थे, यह कम परिष्कृत एंटिलाइसिंग के कारण ही अच्छा नहीं दिखता।

आपकी टिप्पणी के जवाब में:

जेपीईजी संपीड़न के साथ उच्च विपरीत तेज किनारों को पाठ के रूप में एक सामान्य समस्या है क्योंकि यह दोषरहित संपीड़न नहीं है अगर आपको सचमुच जेपीईजी के साथ जाने की जरूरत है और पीएनजी पर स्विच नहीं किया जा सकता है, तो आप छवि की गुणवत्ता और फ़ाइल आकार के बीच बेहतर समझौता करने के लिए अपनी सहेजी गई छवि की संपीड़न गुणवत्ता को सुदृढ़ कर सकते हैं। JPEG को सहेजते समय संपीड़न की गुणवत्ता को सेट करने के लिए निम्न कोड देखें।

import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.plugins.jpeg.JPEGImageWriteParam; import javax.imageio.stream.ImageOutputStream; //---- float quality = 0.85f; File outfile = new File( "MyImage.jpg" ); BufferedImage image = ...; ImageWriter imgWriter = ImageIO.getImageWritersByFormatName( "jpg" ).next(); ImageOutputStream ioStream = ImageIO.createImageOutputStream( outfile ); imgWriter.setOutput( ioStream ); JPEGImageWriteParam jpegParams = new JPEGImageWriteParam( Locale.getDefault() ); jpegParams.setCompressionMode( ImageWriteParam.MODE_EXPLICIT ); jpegParams.setCompressionQuality( quality ); imgWriter.write( null, new IIOImage( image, null, null ), jpegParams ); ioStream.flush(); ioStream.close(); imgWriter.dispose(); 
 import java.awt.image.BufferedImage; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.imageio.*; import java.io.*; import javax.imageio.stream.ImageOutputStream; import javax.imageio.plugins.jpeg.JPEGImageWriteParam; import java.util.Locale; class ImageCompressionDemo { private BufferedImage originalImage; private BufferedImage textImage; private JPanel gui; private JCheckBox antialiasing; private JCheckBox rendering; private JCheckBox fractionalMetrics; private JCheckBox strokeControl; private JCheckBox colorRendering; private JCheckBox dithering; private JComboBox textAntialiasing; private JComboBox textLcdContrast; private JLabel jpegLabel; private JLabel pngLabel; private JTextArea output; private JSlider quality; private int pngSize; private int jpgSize; final static Object[] VALUES_TEXT_ANTIALIASING = { RenderingHints.VALUE_TEXT_ANTIALIAS_OFF, RenderingHints.VALUE_TEXT_ANTIALIAS_ON, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VBGR, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VRGB }; final static Object[] VALUES_TEXT_LCD_CONTRAST = { new Integer(100), new Integer(150), new Integer(200), new Integer(250) }; ImageCompressionDemo() { int width = 280; int height = 100; gui = new JPanel(new BorderLayout(3,4)); quality = new JSlider(JSlider.VERTICAL, 0, 100, 75); quality.setSnapToTicks(true); quality.setPaintTicks(true); quality.setPaintLabels(true); quality.setMajorTickSpacing(10); quality.setMinorTickSpacing(5); quality.addChangeListener( new ChangeListener(){ public void stateChanged(ChangeEvent ce) { updateImages(); } } ); gui.add(quality, BorderLayout.WEST); originalImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); textImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); JPanel controls = new JPanel(new GridLayout(0,1,0,0)); antialiasing = new JCheckBox("Anti-aliasing", false); rendering = new JCheckBox("Rendering - Quality", true); fractionalMetrics = new JCheckBox("Fractional Metrics", true); strokeControl = new JCheckBox("Stroke Control - Pure", false); colorRendering = new JCheckBox("Color Rendering - Quality", true); dithering = new JCheckBox("Dithering", false); controls.add(antialiasing); controls.add(fractionalMetrics); textLcdContrast = new JComboBox(VALUES_TEXT_LCD_CONTRAST); JPanel lcdContrastPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); lcdContrastPanel.add(textLcdContrast); lcdContrastPanel.add(new JLabel("Text LCD Contrast")); controls.add(lcdContrastPanel); textAntialiasing = new JComboBox(VALUES_TEXT_ANTIALIASING); controls.add(textAntialiasing); controls.add(dithering); controls.add(rendering); controls.add(colorRendering); controls.add(strokeControl); ItemListener itemListener = new ItemListener(){ public void itemStateChanged(ItemEvent e) { updateImages(); } }; antialiasing.addItemListener(itemListener); rendering.addItemListener(itemListener); fractionalMetrics.addItemListener(itemListener); strokeControl.addItemListener(itemListener); colorRendering.addItemListener(itemListener); dithering.addItemListener(itemListener); textAntialiasing.addItemListener(itemListener); textLcdContrast.addItemListener(itemListener); Graphics2D g2d = originalImage.createGraphics(); GradientPaint gp = new GradientPaint( 0f, 0f, Color.red, (float)width, (float)height, Color.orange); g2d.setPaint(gp); g2d.fillRect(0,0, width, height); g2d.setColor(Color.blue); for (int ii=0; ii<width; ii+=10) { g2d.drawLine(ii, 0, ii, height); } g2d.setColor(Color.green); for (int jj=0; jj<height; jj+=10) { g2d.drawLine(0, jj, width, jj); } gui.add(controls, BorderLayout.EAST); JPanel images = new JPanel(new GridLayout(0,1,2,2)); images.add(new JLabel(new ImageIcon(textImage))); try { pngLabel = new JLabel(new ImageIcon(getPngCompressedImage(textImage))); images.add(pngLabel); jpegLabel = new JLabel(new ImageIcon(getJpegCompressedImage(textImage))); images.add(jpegLabel); } catch(IOException ioe) { } gui.add(images, BorderLayout.CENTER); output = new JTextArea(4,40); output.setEditable(false); gui.add(new JScrollPane(output), BorderLayout.SOUTH); updateImages(); JOptionPane.showMessageDialog(null, gui); } private Image getPngCompressedImage(BufferedImage image) throws IOException { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); ImageIO.write( image, "png", outStream ); pngSize = outStream.toByteArray().length; BufferedImage compressedImage = ImageIO.read(new ByteArrayInputStream(outStream.toByteArray())); return compressedImage; } private Image getJpegCompressedImage(BufferedImage image) throws IOException { float qualityFloat = (float)quality.getValue()/100f; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); ImageWriter imgWriter = ImageIO.getImageWritersByFormatName( "jpg" ).next(); ImageOutputStream ioStream = ImageIO.createImageOutputStream( outStream ); imgWriter.setOutput( ioStream ); JPEGImageWriteParam jpegParams = new JPEGImageWriteParam( Locale.getDefault() ); jpegParams.setCompressionMode( ImageWriteParam.MODE_EXPLICIT ); jpegParams.setCompressionQuality( qualityFloat ); imgWriter.write( null, new IIOImage( image, null, null ), jpegParams ); ioStream.flush(); ioStream.close(); imgWriter.dispose(); jpgSize = outStream.toByteArray().length; BufferedImage compressedImage = ImageIO.read(new ByteArrayInputStream(outStream.toByteArray())); return compressedImage; } private void updateText() { StringBuilder builder = new StringBuilder(); builder.append("Fractional Metrics: \t"); builder.append( fractionalMetrics.isSelected() ); builder.append("\n"); builder.append( textAntialiasing.getSelectedItem() ); builder.append("\nPNG size: \t"); builder.append(pngSize); builder.append(" bytes\n"); builder.append("JPG size: \t"); builder.append(jpgSize); builder.append(" bytes \tquality: "); builder.append(quality.getValue()); output.setText(builder.toString()); } private void updateImages() { int width = originalImage.getWidth(); int height = originalImage.getHeight(); Graphics2D g2dText = textImage.createGraphics(); if (antialiasing.isSelected()) { g2dText.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); } else { g2dText.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); } if (rendering.isSelected()) { g2dText.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); } else { g2dText.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); } if (fractionalMetrics.isSelected()) { g2dText.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); } else { g2dText.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF); } if (strokeControl.isSelected()) { g2dText.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); } else { g2dText.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); } if (dithering.isSelected()) { g2dText.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); } else { g2dText.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE); } if (colorRendering.isSelected()) { g2dText.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); } else { g2dText.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED); } g2dText.setRenderingHint(RenderingHints.KEY_TEXT_LCD_CONTRAST, textLcdContrast.getSelectedItem()); g2dText.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, textAntialiasing.getSelectedItem()); g2dText.drawImage(originalImage, 0,0, null); g2dText.setColor(Color.black); g2dText.drawString("The quick brown fox jumped over the lazy dog.", 10,50); try { jpegLabel.setIcon(new ImageIcon(getJpegCompressedImage(textImage))); pngLabel.setIcon(new ImageIcon(getPngCompressedImage(textImage))); } catch(IOException ioe) { } gui.repaint(); updateText(); } public static void main(String[] args) { SwingUtilities.invokeLater( new Runnable() { public void run() { ImageCompressionDemo iwt = new ImageCompressionDemo(); } } ); } } 

स्क्रीन शॉट

विशिष्ट आउटपुट

 Fractional Metrics: true Nonantialiased text mode PNG size: 7390 bytes JPG size: 7036 bytes quality: 35 Fractional Metrics: true Antialiased text mode PNG size: 8741 bytes JPG size: 8663 bytes quality: 55 Fractional Metrics: false Antialiased text mode PNG size: 8720 bytes JPG size: 8717 bytes quality: 55 

सिर्फ जावा बस पाठ विरोधी अलियासिंग को बंद करें या अगर आपको वास्तव में इसकी आवश्यकता है, तो एक अलग छवि पर पाठ को प्रस्तुत करें, यदि पाठ काला है, तो आरजीबी (100,100,100) के तहत रंग के साथ सभी पिक्सल प्राप्त करें और उन्हें 0 पर सेट करें। तब बफर को अपनी मुख्य छवि पर चित्रित करें

इसे इस्तेमाल करे:

 public static void setGraphicsQuality(Graphics2D g2D) { g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); }