(resolvido) abrir imagem, escrever string e regravar imagem no hd, girar imagem e imprimir

10 respostas
maior_abandonado

<editado>o problema descrito ai abaixo eu ja consegui resolver, mais tenho outra duvida descrita no proximo post</editado>

pessoal... eu to fazendo um programa aqui pra imprimir cheques...coisa pequena...

esta tudo pronto, exceto a parte de imprimir mesmo... coisa que eu manjo muito pouco por sinal...

o meu código para imprimir seria algo assim:

public static boolean imprime(){
       try{ 
            Frame f = new Frame("Teste de Impressão");
            f.pack();

            Toolkit tk = f.getToolkit();

            PrintJob pj = tk.getPrintJob(f, "cheque", null);

            if (pj!=null) {

                Graphics g = pj.getGraphics(); 

                //prepara o desenho nesse método, altera o objeto referenciado por g
                desenhaCheque(g);

                g.dispose(); // libera recursos do contexto gráfico
                pj.end();    // encerra impressão

            }
            f.dispose();
            
            return true;
       }catch(Exception e){
           return false;
       }

ok... com uma folha A4 comum eu consigo imprimir numa boa, com uma folha de cheque que tem 7,5 cm se não me engano, a folha para no toner e acaba nao imprimindo... (aki é tudo impressora a laser, não tenho uma matricial disponivel)

colocando o cheque de pé, em impressoras aonde da pra ajusta quanto vai ter de lado a folha, pro tamanho do cheque assim, a impressora até imprime, mais para isso eu teria que gira a imagem do meu objeto graphics tb, acredito que em 90 graus... é ai q eu to quebrando a cabeça...

googlando eu nao consegui resolver isso, o maximo que eu consegui foi da o cast do meu graphics conseguido do printjob em um graphics2d e usa o metodo rotate, mais depois como inseri-lo dentro do graphics anterior ou passa-lo para o printjob?

eu não encontrei um setGraphics em printjob, passa um para o outro atribuindo com o = mecheria com a referencia e não com o objeto em si...

alguém ai tem algum norte?

10 Respostas

maior_abandonado

bom… eu consegui resolver em relação a girar a imagem…dando uma pesquisada no forum eu encontrei o que fazer, criei um bufferedImage, dei um createGraphics(), chamei o rotate no graphics2D retornado e escrevi o bufferedImage no graphics retornado pelo printJog, atravéz do metodo drawImage (eu ja tinha visto esse metodo drawImage antes mais demorei pra perceber que o elemento Image a ser escrito poderia ser um bufferedImage…ja que ele é um filho de Image… sim eu fui burro nisso…rs)

minha duvida agora é outra…

eu tenho a intenção ler uma imagem em disco, escrever uma string nela e mandar para a impressora, o seguinte código esta lendo o arquivo, eu dei o drawString e mandei salvar em disco primeiro pra teste, para ver o resultado, como esta o arquivo… mais a string nao esta sendo escrita, a imagem original esta sendo salva sem modificações feitas… alguém saberia me dizer o por que, como resolver?

para tal estou tentando usar o seguinte código:

try {

            java.io.InputStream in = i.getClass().getResourceAsStream("/br/com/xxx/Cheques/imagens/imagem.JPG");


            BufferedImage imagem = ImageIO.read(in);//blz...leu o arquivo,  por que esta salvando igual

            Graphics2D gg = imagem.createGraphics();
            Font f = gg.getFont();
            gg.setFont(new Font(f.getName(), f.getStyle(), 12));//seto uma fonte maior do que eu quero


            gg.drawString("aaaaaaaaaaaa", 100, 100);//nada é escrito, a imagem tem mais de 1000 tanto de largura quanto altura

            imagem.flush();//só por desencargo de conciencia, não funciona
            ImageIO.write(imagem, "JPG", new File("teste.JPG"));


            System.out.println("cheguei aki");//isso esta sendo impresso, acredito que não tenham excessões
        } catch (IOException ex) {
            ex.printStackTrace();
        }
victorwss

Não lembro direito, mas se não me engano há um método getGraphics ao invés de createGraphics. Tenta isso.

maior_abandonado

eu ja tentei… o getGraphics retorna um objeto graphics, pai de graphics2D, é de la que vem o metodo usado, o drawString, dito cujo não esta surtindo efeito…

ViniGodoy

Antes do write faça:

gg.dispose();
maior_abandonado

bom… muito fulo da vida em relatar aqui o motivo de por que não estava aparecendo a string escrita…

antes de tudo agradeço ao victorwss por ter respondido…

bom…o problema é que eu estava tentando escrever numa parte sem nada da imagem… numa parte da cor do fundo, ou seja… branca…

ao criar o BufferedImage, a cor usada como background é preta, não sei se por que preto é a ausencia de cor… sendo assim a cor usada para as linhas, quadrados, letras que se desenha é… branca… ao se pegar o objeto graphics…

bom…resumindo eu sem saber estava escrevendo usando uma letra branca… no fundo branco…

depois de uma tarde inteira perdida, com uma bestera dessas…

eu vo, toma um café e da uma relaxada… eu mereço

maior_abandonado

vlw vini… ao que parece não era isso… mais obrigado assim mesmo…

ViniGodoy

Esse era meu próximo chute. Eu ia falar para você verificar se a cor do texto não era igual a cor da imagem (já perdi uma tarde nisso também) e para ver se a imagem que você estava abrindo era realmente a mesma que a que vc estava gravando (outra tarde).

Em todo caso, algumas dicas:

  1. Não se dá dispose em objetos gráficos obtidos através do getGraphics(). Você faz isso sempre que usar a palavra “create”;
  2. create é mesmo preferível ao getGraphics();
maior_abandonado

vlw ai as dicas obrigado mesmo, mais não intendi a primeira

não se da dispose em um graphics mais sim se eu tiver usando graphics2d, o que é preferivel? por que não?

ViniGodoy

É simples. Se vc usa um get, ou recebe um Graphics (ou Graphics2D) por parâmetro, significa que o java está te “emprestando” um contexto gráfico.
Nesse caso, faça a cópia com create() e depois apague essa cópia com dispose().

Agora, não dê dispose nesse Graphics que ele te emprestou… pq aí, quem vai ficar sem o objeto para desenhar é ele!!

maior_abandonado

vlw denovo as dicas…

Criado 5 de fevereiro de 2009
Ultima resposta 10 de fev. de 2009
Respostas 10
Participantes 3