[JAVA]Roteren van een BufferedImage

Pagina: 1
Acties:

  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Kprobeer een zelfgemaakt LightWeight component te roteren met een functie rotate(). Roteren in de Paint() functie werkt goed via een Graphics2D object. Probleem alleen is dat als ik buiten de paint() functie de BufferedImage wil gebruiken om een createGraphics() op te doen de instantieattribuut met daarin de BufferedImage leeg is.

Een heel verhaal. Maar het komt er op neer dat ik een Image wil roteren. En dat lukt niet buiten de paint() functie. Iemand enig id wat er fout zou kunnen gaan?

If it's just us, it seems like an awful waste of space


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
Hmm, min of meer hetzelfde een keer gehad... ben ook wel benieuwd naar oplossing ..

Al wat geprobeerd met AffineTransform ?!

Verwijderd

Laat eens wat code zien...

Als je een class maakt en daarin een buffered image als private field definieert en die aanmaakt in de constructor, dan kun je verder altijd gewoon daar de graphics vanaf halen. Het roteren kun je verder doen met een AffineTransform.

Tip: Java 2D API Graphics van Vincent J. Hardy is een aanrader !! (ISBN 0130142662)

  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

ik heb al eens zoiets ge asked op het forum, check de search functie maar eens als die weer werkt.

  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Op dinsdag 27 november 2001 16:05 schreef jRobert het volgende:
Laat eens wat code zien...
kee... VANGUH!!!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
...
private BufferedImage bi;
...
public void paint( Graphics g )
{
  Graphics2D g2 = (Graphics2D)g;
  Graphics2D big = bi.createGraphics();
  ...
  big.setColor( Color.green );
  double puntx = 10;
  double punty = 0;
  double hoek1x = 10 + ( Math.sin( Math.toRadians(140) ) * 10 );
  double hoek1y = 10 + ( Math.cos( Math.toRadians(140) ) * -10 );
  double hoek2x = 10 + ( Math.sin( Math.toRadians(-140) ) * 10 );
  double hoek2y = 10 + ( Math.cos( Math.toRadians(-140) ) * -10 );
  big.drawLine( (int)puntx, (int)punty, (int)hoek1x, (int)hoek1y );
  big.drawLine( (int)puntx, (int)punty, (int)hoek2x, (int)hoek2y );
  big.drawLine( (int)hoek1x, (int)hoek1y, (int)hoek2x, (int)hoek2y );
  ...
  g2.drawImage(bi,0,0,this );
  g2.dispose();
}
public void rotate( double i )
{
  Graphics2D big = bi.createGraphics();
  big.rotate( i, 10, 10 );
  big.drawImage(bi, 0,0,this );
  big.dispose();
}
Als je een class maakt en daarin een buffered image als private field definieert en die aanmaakt in de constructor, dan kun je verder altijd gewoon daar de graphics vanaf halen. Het roteren kun je verder doen met een AffineTransform.
Dat deels dus gedaan.. probleem is echter dat de attribuut bi (BufferedImage) null blijft. En er dus op de roteer regel een NullPointerException ontstaat omdat er geen Graphics2D object is...

Kzal ff de docs induiken betreffende die AffineTransform..
Tip: Java 2D API Graphics van Vincent J. Hardy is een aanrader !! (ISBN 0130142662)
Kzal eens kijken.. thx!

If it's just us, it seems like an awful waste of space


  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Het maken van een BufferedImage in de constructor is zinloos lijkt het...

De regel:
code:
1
2
3
bi = (BufferedImage)createImage(20, 20);
if( bi == null )
  System.out.println("BufferedImage bi is null"):

in de constructor levert nl die println in console op.

If it's just us, it seems like an awful waste of space


  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Ik begin te vermoeden dat het probleem is dat de paint() waarin de bi attribuut geset wordt niet klaar is op het moment dat ik gebruik wil maken van dat attribuut in een andere functie. Als ik nl een System.out.println() in de paint en in de rotate functie zet en ik show() het component eerst voordat ik ga roteren dan krijg ik toch eerste de println() van de rotate en dan pas die van de paint(). duss... hoe kan ik een methode compleet laten afronden voordat de volgende verder mag.?

If it's just us, it seems like an awful waste of space


  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static BufferedImage rotate(BufferedImage input, double angle) {
    int width = input.getWidth();
    int height = input.getHeight();
    BufferedImage output = new BufferedImage(width, height, input.getType());

    double a0 = Math.cos(angle*Math.PI/180.0);
    double b0 = Math.sin(angle*Math.PI/180.0);
    double a1 = -b0, b1 = a0;

    IntervalTimer timer = new IntervalTimer();
    timer.start();
    int rx, ry, n = 0;
    for (int y = 0; y < height; ++y)
    for (int x = 0; x < width; ++x) {
      rx = (int) Math.round(a0*x + a1*y);
      ry = (int) Math.round(b0*x + b1*y);
      if (rx >= 0 && rx < width && ry >= 0 && ry < height)
        output.setRGB(rx, ry, input.getRGB(x, y));
      else
        ++n;
    }
    System.out.println("Rotation complete [" + timer.stop() + " sec]");
    System.out.println(n + " pixels could not be mapped");

    return output;

  }

  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Leuke oplossing.. maareh.. IntervalTimer zit niet in jdk1.3 :) Ik kan uitsluitend awt gebruiken...

En daarbij... waarom zou ik nu wel een BufferedImage hebben?

If it's just us, it seems like an awful waste of space


  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

Op woensdag 28 november 2001 15:02 schreef HurrI het volgende:
Leuke oplossing.. maareh.. IntervalTimer zit niet in jdk1.3 :) Ik kan uitsluitend awt gebruiken...
IntervalTimer kan je weg laten |:(

  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Op woensdag 28 november 2001 15:25 schreef Scorpion het volgende:

[..]

IntervalTimer kan je weg laten |:(
[mental note]
Denk na voordat je iets zegt...
[/mental note]

If it's just us, it seems like an awful waste of space


Verwijderd

Als ik me niet vergis duurt het even voordat een image gecreerd is, deze word dan via een apparte thread gecreeerd. Je moet dus ff wachten totdat het image gecreeerd is. Kweet niet of je het image object gelijk na het aanmaken probeerd te benaderen want dan kun je dat probleem wel eens hebben.

  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Op donderdag 29 november 2001 00:44 schreef Reneos het volgende:
Als ik me niet vergis duurt het even voordat een image gecreerd is, deze word dan via een apparte thread gecreeerd. Je moet dus ff wachten totdat het image gecreeerd is. Kweet niet of je het image object gelijk na het aanmaken probeerd te benaderen want dan kun je dat probleem wel eens hebben.
Dat probeer ik idd... is er een manier om te w88 totdat de image gemaakt is en dan pas verder met de rest van de code?

If it's just us, it seems like an awful waste of space

Pagina: 1