2010-04-17 15 views
34

मैंने समान नाम वाले प्रश्नों की जांच की है, लेकिन वे इस उपयोग के मामले का उत्तर नहीं देते हैं।BufferedImage पर ओवरले टेक्स्ट करने के लिए ग्राफिक्स 2 डी का उपयोग करके और एक BufferedImage

असल में, मुझे किसी दिए गए समन्वय (x, y) पर कुछ टेक्स्ट (टेक्स्ट) ओवरले करना था, मेरे पास पैकेज में निम्न कार्य है;

protected BufferedImage Process2(BufferedImage image){ 
    Graphics2D gO = image.createGraphics(); 
    gO.setColor(Color.red); 
    gO.setFont(new Font("SansSerif", Font.BOLD, 12)); 
    gO.drawString(this.text, this.x, this.y); 
    System.err.println(this.text+this.x+this.y); 
    return image; 
} 

मुझे लगता है कि मैं कुछ स्पष्ट रूप से स्पष्ट रूप से याद कर रहा हूं; मैं ग्राफिक्स 2 डी के हर संदर्भ को किसी भी गेम से निपट रहा हूं या सीधे फाइल पर लिख रहा हूं लेकिन मुझे बस एक बुफर्ड इमेज लौटा है। ओवरले 'rendered'

वर्तमान कोड में, छवि अंत अपरिवर्तित दिखाई देती है।

धन्यवाद!

+1

आप एक छवि फ़ाइल को संशोधित करने की कोशिश कर रहे हैं? आपको क्या करना चाहिए लेकिन आप केवल छवि के स्मृति प्रतिनिधित्व में संशोधन कर रहे हैं। – Guillaume

+1

इसके अलावा, क्या आप सुनिश्चित हैं कि एक्स और वाई छवि के अंदर हैं? पहले परीक्षण – Guillaume

+1

के लिए कॉर्ड (0,0) पर एक वर्ग को पेंट करने का प्रयास करें, एक तरफ, यह एक बार है 'ग्राफिक्स 2 डी' उदाहरण पर' निपटान() 'को कॉल करना उचित है। – trashgod

उत्तर

65

विधि drawString() वाम-पंथी चरित्र की baseline के लिए एक्स और y उपयोग करता है। संख्याओं में आमतौर पर कोई वंशज नहीं होता है; यदि यह text का सत्य है, तो स्थिति (0,0) पर खींची गई स्ट्रिंग पूरी तरह से छवि के बाहर प्रस्तुत की जाएगी। यह example देखें।

परिशिष्ट: आपको अपनी छवि में एक असंगत रंग मॉडल के साथ परेशानी हो सकती है। एक साधारण उपयुक्त छवि को प्रस्तुत करना है और फिर इसे को सीटू में संशोधित करना है।

Hello

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

/** 
* @see https://stackoverflow.com/questions/2658663 
*/ 
public class TextOverlay extends JPanel { 

    private BufferedImage image; 

    public TextOverlay() { 
     try { 
      image = ImageIO.read(new URL(
       "http://cdn.sstatic.net/stackexchange/img/logos/so/so-logo.png")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     image = process(image); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(image.getWidth(), image.getHeight()); 
    } 

    private BufferedImage process(BufferedImage old) { 
     int w = old.getWidth()/3; 
     int h = old.getHeight()/3; 
     BufferedImage img = new BufferedImage(
      w, h, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2d = img.createGraphics(); 
     g2d.drawImage(old, 0, 0, w, h, this); 
     g2d.setPaint(Color.red); 
     g2d.setFont(new Font("Serif", Font.BOLD, 20)); 
     String s = "Hello, world!"; 
     FontMetrics fm = g2d.getFontMetrics(); 
     int x = img.getWidth() - fm.stringWidth(s) - 5; 
     int y = fm.getHeight(); 
     g2d.drawString(s, x, y); 
     g2d.dispose(); 
     return img; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 0, 0, null); 
    } 

    private static void create() { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new TextOverlay()); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       create(); 
      } 
     }); 
    } 
} 
+0

मेरे परीक्षणों के लिए मैं x = image.getHeight()/2 और इसी तरह y के लिए उपयोग कर रहा हूं, इसलिए मुझे नहीं लगता कि यह मुद्दा है, लेकिन धन्यवाद! – Bolster

+0

कोई भी मौका जिसे आप 'paintComponent()' को नए की बजाय पुरानी छवि के साथ बुला रहे हैं? – trashgod

+0

मैं किसी भी जेकंपोनेंट्स का उपयोग नहीं कर रहा हूं इसलिए नहीं, कोई पेंट कॉम्पोनेंट नहीं; लेकिन अगर मैं कुछ मौलिक याद कर रहा हूं, तो कृपया मुझे इसके साथ थप्पड़ मारो, मैं एक जीयूआई कोडर नहीं हूं और जावा में ग्राफिक्स से निपटने का बहुत कम ज्ञान नहीं है, इसलिए यह पूरी तरह से गलत दृष्टिकोण हो सकता है – Bolster

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