Avatar billede jonasbc Nybegynder
16. juli 2002 - 10:10 Der er 5 kommentarer og
1 løsning

Resizing vha. double buffering

Hej!

Jeg sidder og roder med noget grafik i størrelsen 1024x576 (wide-screen). Desværre har jeg kun mulighed for at se det i en opløsning på 720x576.
Derfor ville det være smart med et panel, der med double buffering kan resize grafikken til en bredde på 720 og derefter tegne den...

På suns hjemmeside finder jeg et eksempel på double buffering:

  /**
  * paint children into an offscreen buffer, then blast entire image
  * at once.
  */
  public void paint(Graphics g) {
      if(offscreen == null) {
        offscreen = createImage(getSize().width, getSize().height);
      }
      Graphics og = offscreen.getGraphics();
      og.setClip(0,0,getSize().width, getSize().height);
      super.paint(og);
      g.drawImage(offscreen, 0, 0, null);
      og.dispose();
  }

- Men hvad skal jeg ændre størrelsen på og hvordan? De forsøg, jeg har gjort indtil videre, ændrer godt nok størrelsen på billedet, men skærer alt ud over de 720 pixels væk...

- Jonas
Avatar billede disky Nybegynder
16. juli 2002 - 10:24 #1
prøv med:

public void paint(Graphics g) {
      if(offscreen == null) {
        offscreen = createImage(1024,576);
      }
      Graphics og = offscreen.getGraphics();
      og.setClip(0,0,1024,576);
      super.paint(og);
      g.drawImage(offscreen, 0, 0, null);
      og.dispose();
  }
Avatar billede jonasbc Nybegynder
16. juli 2002 - 10:29 #2
Det ændrer desværre ingenting...
Avatar billede jonasbc Nybegynder
16. juli 2002 - 10:34 #3
Jeg kan løse størrelses problemet nu med:

    public void paint(Graphics g) {
          if(offscreen == null) {
            offscreen = createImage(1024,576);
          }
          Graphics og = offscreen.getGraphics();
          og.setClip(0,0,1024,576);
          super.paint(og);
          g.drawImage(offscreen, 0, 0, 720, 576, null);
          og.dispose();
    }

Men der er noget bøvl med gentegningen af grafikken, når elementer skrifter fokus... Anyone?

Jeg har forresten også:
 
public void invalidate() {
    super.invalidate();
    offscreen = null;
}

public void update(Graphics g) {
    paint(g);
}
Avatar billede carstenknudsen Nybegynder
16. juli 2002 - 10:38 #4
Du kan prøve at lave en affin transformation så
at det store billede bliver skaleret når
du tegner med g (ikke og).
AffineTransform at = new AffineTransform();
at.scale(720.0/1024.0,576.0/576.0);
g.setTransform( at );
PS Du skal lige caste til Graphics2D objekter
for at det virker.
Avatar billede jonasbc Nybegynder
16. juli 2002 - 10:44 #5
Åh, jeg glemte at sige, at det skal køre under JDK 1.1.8... dvs. java.awt.geom eksisterer ikke.

Så'n noget bøvl....
Avatar billede jonasbc Nybegynder
16. juli 2002 - 10:47 #6
Jeg kan løse det ved at kalde en repaint() i slutningen af paint(), men det er nok ikke ligefrem den smarteste løsning... :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester