rysowanie do pliku przy pomocy GDC

0

Witam,

do tej pory rysuję bezpośrednio w okienku Javy:

MojObiekt.java

   public void draw (Graphics gDC)
   {
      gDC.drawRect(x - 15, y - 15, 125, 35);
      gDC.drawString("jakis tekst");
   }

BazaObiektow.java

   public void drawAll(Graphics gDC)
   {
      for (int i = 0; i < mojWektor.size(); i++)
      { getMojObiekt(i).draw(gDC); }
   }

GlownyPlik.java

   public void paint (Graphics gDC)
   { BazaObiektow.drawAll(gDC); }

Czy mogę prosić o jakieś sugestie, jak rysować bezpośrednio do pliku graficznego (najlepiej bmp, z możliwością późniejszej konwersji na inny typ pliku)?

Pozdrawiam!

1

Możesz rysować do pamięci, klasa MemoryImageSource, a potem użyć metody createImage().

0

2011-11-30:

Dzięki,

zacząłem w ten sposób, że z dokumentacji Oracle wrzuciłem fragment kodu do kolejnej pozycji menu:

        else if (menuOpen.equals("Tworz obraz")) {
            //kod: http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/image/MemoryImageSource.html
            int w = 100;
            int h = 100;
            int pix[] = new int[w * h];
            int index = 0;
            for (int y = 0; y < h; y++) {
                int red = (y * 255) / (h - 1);
                for (int x = 0; x < w; x++) {
                    int blue = (x * 255) / (w - 1);
                    pix[index++] = (255 << 24) | (red << 16) | blue;
                }
            }
            Image img = createImage(new MemoryImageSource(w, h, pix, 0, w));
        }

Czyli jak rozumiem teraz mam stworzony w pamięci obrazek. Muszę go następnie wyświetlić w oknie lub zapisać do pliku (interesuje mnie i jedno i drugie). W jaki sposób wrzucić go do pliku?

Prócz tego zastanawiam się, jak np. narysować prostokąt czy napisać tekst. Do tej pory robiłem to poprzez

gDC.drawRect(int1,int2,int3,int4);
gDC.drawString("tekst");

nie wiem, jak powyższe zastosować dla pix[].

Pozdrawiam!

2011-12-01:

Witam,

teraz kod związany z otwarciem pozycji menu "rysowanie" jest taki:

        else if (menuOpen.equals(cmd)) {
            //http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/image/MemoryImageSource.html
            //======== RYSOWANIE W PAMIĘCI ========
            int w = 100;
            int h = 100;
            int pix[] = new int[w * h];
            int index = 0;
            for (int y = 0; y < h; y++) {
                int red = (y * 255) / (h - 1);
                for (int x = 0; x < w; x++) {
                    int blue = (x * 255) / (w - 1);
                    pix[index++] = (255 << 24) | (red << 16) | blue;
                }
            }
            Image img = createImage(new MemoryImageSource(w, h, pix, 0, w));
            
            //http://docs.oracle.com/javase/7/docs/api/javax/swing/JFileChooser.html
            //=== WYBIERANIE MIEJSCA ZAPISU PLIKU ======
            JFileChooser chooser = new JFileChooser();
            FileNameExtensionFilter filter = new FileNameExtensionFilter(
                "JPG & GIF Images", "jpg", "gif");
            chooser.setFileFilter(filter);
            int returnVal = chooser.showOpenDialog(parent);
            if(returnVal == JFileChooser.APPROVE_OPTION) {
               System.out.println("You chose to open this file: " +
                    chooser.getSelectedFile().getName());
            }
            
            //===== EDYCJA RYSUNKU =======
            int type = BufferedImage.TYPE_INT_ARGB;
            BufferedImage bi = new BufferedImage(width, height, type);  
            Graphics2D g2d = bi.createGraphics();  
            //najpierw zapisuje istniejący obraz
            g2d.drawImage(img, 0, 0, null);  
            //rysowanie czegokolwiek innego
            //zwolnienie
            g2d.dispose();
        }

Kłopotem jest dla mnie zakres zmiennych parent (oraz analogicznie width i height):

parent is not public in java.awt.Component; cannot be accessed from outside package

oraz zastosowanie drawRect i drawString w kontekście powyższego kodu.

Pozdrawiam!

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