składanie obrazu przed skalowaniem.

0

W zasadzie sprawa jest krótka:
Chciałbym coś wydrukować, jednak wcześniej sprawdzić czy nie wymaga to przeskalowania by się poprawnie zmieściło na stronie (lub dać użytkownikowi możliwość manipulowania jak rozmieścić te elementy na stronie. (tu póki co myślę, że nie będzie z tą częścią problemu).

Mam już trochę kodu rysującego elementy składowe mojego rysunku, np.

g2.translate( pf.getImageableX()+skala.SIZE , pf.getImageableY());
poziomaSkala[0].rysuj(g2); 

Jednak ze względu na to, że zamierzam sprawdzić na sam koniec czy nie trzeba skalować musiałbym chyba najpierw gdzieś wszystko wyrysować jak leci, a dopiero potem sprawdzić czy ten "zbuforowany" rysunek się mieści.

No i pytanko:
Jak to wszystko wyrysować na jakimś obiekcie (a dopiero później go dalej skalować)??

P.S. (pewnie to proste, ale potrzebuję pomocy)

0

Naprawdę nikt nie pomoże?

0
piotrkeit napisał(a)

Naprawdę nikt nie pomoże?

niektórzy chodzą spać o 22, a wracają ze szkoły/pracy o 14/18, lub wstają o 12.

W tym czasie mogłeś poszperać na googlach i na przykład wpaść na pomysł utworzenia nowego Image i w nim narysować wszystko co potrzebujesz, jeśli o to i chodzi.

0

Przyznaje się - straciłem poczucie czasu. Poszperałem skuteczniej i zdecydowałem się zastosować klasę BufferedImage. Wygląda to teraz w ten sposób:
BufferedImage bufor = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB );

 
                           Graphics2D g2d = (Graphics2D) bufor.getGraphics();
			   g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON );
			   g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON );

			   g2d.translate(35,0);
			   poziomaSkala[0].rysuj(g2d);
			   g2d.translate(-35,35);
			   pionowaSkala[0].rysuj(g2d);
			   g2d.translate(35,0);
			   kwadraty[0].paint(g2d); 

                           g2.drawImage(bufor, null,0,0 );

Niestety rysowane komponenty ze skalą mimo sotosowania metdy setRenderingHint wyglądają nieciekawie. Czy popełniam błąd stosując ją dla g2 (o ile dobrze pamiętam zastosowanie jej dla g2d też nie poprawiło sprawy.)
Podpowie ktoś co jest nie tak?

0

zrobiłem tak:

 
                           Graphics2D g2 = (Graphics2D) g;

                           BufferedImage bufor = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB  ); 
			   Graphics2D g2d = (Graphics2D) bufor.getGraphics();

                           RenderingHints hints = new RenderingHints(null);
			   hints.put(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON );
			   hints.put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
			   hints.put(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY );
			   hints.put(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BICUBIC); 

                           g2.setRenderingHints(hints);
			   g2d.setRenderingHints(hints);  
                           
                           g2d.translate(35,0);
			   poziomaSkala[0].rysuj(g2d);
			   g2d.translate(-35,35);
			   pionowaSkala[0].rysuj(g2d);
			   g2d.translate(35,0);
			   kwadraty[0].paint(g2d);

                           g2.drawImage(bufor, null,0,0 );
			   

I nadaj wygląda to znacznie gorzej niż bezpośrednie rysowanie tych komponentów przez g2 (nawet z wyłączonym aliasingiem itp. ). Czy coś jest źle w tym co mam, czy z jakiś innych względów BufferedImage się tu nie nadaje?

Dlaczego zdecydowałem się na podział: rysowanie zawartości do kupy- wyświetlanie jej, ponieważ wydaje mi się, że tak będzie przejrzyściej w kodzie (zamierzam tworzyć kilka podobnych obrazków i umieszczać je na stronie do wyduku, więc będe (chciałem) dalej stosować przekształcenie afiniczne rozmieszczające i zmniejszające mi te obrazki na stronie. (samo zmniejszenie pojedynczego obrazka bez sposowania żadnych kluczy-wartości RenderingHints i używania BufferedImage daje dobry efekt)

Poradzicie coś?

0

Kiedyś też tak próbowałem użyć do drukowania klasy BufferedImage, ale efekty nie były zadowalające.

Ostatecznie zrezygnowałem z BufferedImage i rysowałem bezpośrednio na JPanel (podgląd wydruku) oraz na obiekcie Graphics z metody "public int print(Graphics g, PageFormat pf, int page)" (sam druk).

Całe szczęście w obydwu przypadkach mamy obiekt Graphics i samą implementację rysowanie możemy przenieść do jakiejś wspólnej metody. Dzięki temu unikniemy duplikacji kodu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1