składanie obrazu przed skalowaniem.

Odpowiedz Nowy wątek
2011-09-08 23:24
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)

Pozostało 580 znaków

2011-09-09 12:32
0

Naprawdę nikt nie pomoże?

Pozostało 580 znaków

2011-09-09 12:48
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.

Pozostało 580 znaków

2011-09-09 19:32
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?

Ja bym spróbował jeszcze "KEY_RENDERING - VALUE_RENDER_QUALITY" - wybiera algorytmy rysowania o większej efektywności lub dokładności (jeśli są dostępne) Lub KEY_INTERPOLATION - VALUE_INTERPOLATION_BICUBIC - powinno wygładzić przeskalowany obrazek. ogólnie KEY_INTERPOLATION - wybiera regułę interpolacji podczas skalowania obrazów - szypxx 2011-09-09 21:01

Pozostało 580 znaków

2011-09-10 11:07
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ś?

Pozostało 580 znaków

2011-09-11 11:44
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.


Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5
edytowany 4x, ostatnio: __krzysiek85, 2011-09-11 11:46

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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