Escrevendo texto em imagens

13 respostas
G

Srs:

Estou desenvolvendo um programinha simples, que deve escrever texto em cima das imagens. Estou usando GradientPaint para isso, so que esta classe server para fazer degrade e meu texto acaba ficando borrado.

Acho que devo usar outra classe mais nem ideia.

Meu código

public static void gravaTexto(String arqEntra,String arqSai,double posX,double posY,String texto) throws IOException
    {
    	File f = new File(arqEntra);
        BufferedImage im = ImageIO.read(f);        
         
        Graphics2D g = im.createGraphics();       
        g.setFont(new Font("Arial", Font.BOLD, 9));  
        
        TextLayout tl = new TextLayout(texto.toUpperCase(), g.getFont(), g.getFontRenderContext());
        
        
        double x2 = im.getWidth();
        double y2 = im.getHeight();        
        
        g.setPaint(new GradientPaint(0f, 0f, Color.BLACK, 0,0, new Color(255,255,255), true));
       
        tl.draw(g, (float)(x2-posX), (float)(y2-posY));         
        
        ImageIO.write(im, "jpeg", new File(arqSai));
    }

13 Respostas

V

Já tentou ligar o AntiAlias e definir alguns RenderingHints? Logo após obter o seu Graphics2D faça:

g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

Só mais um detalhe. Seu gradient está começando e terminando no mesmo lugar. Você deve usar o FontMetrics para calcular a largura/altura do seu texto e ajustar a posição do ponto 2.

G

Nao deu certo!

O que eu queria era q nao tivesse esse degrade, queria escrever direto na imagem. So que a unica forma que achei foi usando esse gradiente.

V

Ah tá!!! Então o gradiente não é necessário mesmo!!

Use o método drawString!

T

Dica: a classe java.awt.Color implementa a interface java.awt.Paint, portanto pode ser passada como parâmetro para setPaint. Exemplo:

g.setPaint(Color.BLACK);
G

Agora sim ficou blz.Nao sei como nao lembrei desse metodo…hehe

So uma coisa, a imagem ta ficando manchada aonde ele escreve o texto.
Acho q eh por causa da resolucao ou algo assim. Alguma dica?

Obrigado

V

O que você quer dizer com “manchada”?

G

veja

http://www.flickr.com/photos/58346902@N00/383788609/

Fica manchado de cinza atras da escrita!

O mesmo acontece qdo coloco uma linha em cima da imagem.

Fica manchado

T

Se você usar compressão JPEG isso fatalmente irá ocorrer.
É um “artefato” da compressão.
Se você salvar a imagem como PNG, por exemplo (que faz compressão mas sem perdas, ou seja, não modifica a imagem original) essas “manchas” não irão aparecer.

G

pois eh acabei de descobrir isso…nao tem como eu setar o valor da compreensao na hora de gerar a a imagem?

T

Deve haver um JPEGEncodingParameters ou coisa parecida que você deve passar para algum método dessa classe javax.image.ImageIO, para alterar a qualidade da compressão.

T

http://forum.java.sun.com/thread.jspa?threadID=754493

G

Thingol
nem ideia de como fazer isso. Engraçado q no metodo que desenha o quadrado nao borra a imagem.

Metodo de escrever texto (esse borra)
public static void gravaTexto(String arquivo,int fator,String texto) throws IOException
	{
		File f = new File(arquivo);
		BufferedImage im = ImageIO.read(f);        
		
		Graphics2D g = im.createGraphics(); 
		g.setColor(Color.BLACK);
		g.setFont(new Font("Arial", Font.BOLD, 9));  

		g.drawString(texto, im.getWidth()-125, im.getHeight()-75);

		ImageIO.write(im, "jpeg", new File(arquivo));
	}
G

Solucionado

Fica a solução aqui

public static void gravaTexto(String arquivo,int fator,String texto) throws Exception
	{		
		float factor = 0f;		

		try
		{
		
//			this code ensures that all the pixels in the image are loaded
			Image temp = new ImageIcon(arquivo).getImage();

//			create the buffered image
			BufferedImage bufferedImage = new
			BufferedImage(temp.getWidth(null),
					temp.getHeight(null), BufferedImage.TYPE_INT_RGB);

//			copy image to buffered image
			Graphics g = bufferedImage.createGraphics();

//			clear background and paint the image
			g.setColor(Color.white);
			g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
			g.drawImage(temp, 0, 0, null);		

			g.setColor(Color.BLACK);
			g.setFont(new Font("Arial Regular", Font.PLAIN, 8));  

			g.drawString("Bla bla bla.", bufferedImage.getWidth()-125, bufferedImage.getHeight()-70+fator);	
					
			
			g.dispose();

//			sharpen/soften (depending on factor (-ve for sharpening, +ve for softening)
			float[] array = {0, factor, 0, factor, 1 - (factor * 4),
					factor, 0, factor, 0};
			Kernel kernel = new Kernel(3, 3, array);
			ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP,
					null);
			bufferedImage = cOp.filter(bufferedImage, null);

//			write the jpeg to a file
			OutputStream out = new FileOutputStream(arquivo);

//			encodes image as a JPEG data stream
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			com.sun.image.codec.jpeg.JPEGEncodeParam param =
				encoder.getDefaultJPEGEncodeParam(bufferedImage);
			param.setQuality(1f, true);
			
			encoder.setJPEGEncodeParam(param);
			encoder.encode(bufferedImage);			
		}
		catch (Exception e)
		{
			throw e;
		}
		
	}
Criado 8 de fevereiro de 2007
Ultima resposta 16 de fev. de 2007
Respostas 13
Participantes 3