# Image spiegeln



## ganonlight (17. Apr 2011)

Ich weiß, dazu kann man was in google finden, auch einen Thread hier im Forum. Aber da Thema scheint ja doch nicht ganz so einfach zu sein. Ich hab auch schon was von den Vorschlägen ausprobiert, hat aber nicht so richtig geklappt.  Ohne Ausprobieren kann ich auch nicht beurteilen, ob das jetzt funktioniert oder nicht und ich hab nicht wirklich Zeit, um alle Vorschläge, die ich gefunden hab, auszutesten. 8/
Jedenfalls gehts um folgendes: Ich versuch grade ein Beat em up zu programmieren und da muss ich natürlich unterscheiden, ob der Character nach links oder rechts schaut. Zuerst wollte ich einfach jeweils 2 Bilder speichern, eins für links, eins für rechts. Aber am Ende soll man ja schon einige Attacken zur Verfügung haben und dann müsste ich für jeden Teil einer Animation 2 Bilder speichern, und ich weiß nicht, ob das besonders gut gelöst wäre..
Wenn nicht, würd ich eben gern Bilder spiegeln können. Und zwar so, dass die x-Position an der gleichen Stelle bleibt, also nur das Bild umgedreht wird.


----------



## Atze (17. Apr 2011)

Ultimate Java Image Manipulation

unter dem punkt "flipping images" solltest du genau das finden was du suchst. falls nicht, einfach nochmal bescheid sagen


----------



## Volvagia (17. Apr 2011)

Ich würde aber schon 2 Bilder nehmen.
http://www.java-forum.org/spiele-multimedia-programmierung/80871-character-bild-links-rechts.html


----------



## ganonlight (17. Apr 2011)

Volvagia hat gesagt.:


> Ich würde aber schon 2 Bilder nehmen.
> http://www.java-forum.org/spiele-multimedia-programmierung/80871-character-bild-links-rechts.html



Ich könnte schon immer zwei machen, aber ich hab auch gehofft, dass ich mir dadurch ein bisschen Arbeit spare und es auch nicht gleich immer eine NullPointer Exception gibt, wenn ich einmal eine SPiegelung vergessen habe.
Den letzten Vorschlag der Seite hab ich schon ausprobiert. Irgendwie hat da nicht so recht funktioniert, die x-Koordinate hat sich zwar nicht geändert, aber das gespiegelte Bild war irgendwie trotzdem weiter rechts, keine Ahnung wieso.



Atze hat gesagt.:


> Ultimate Java Image Manipulation
> 
> unter dem punkt "flipping images" solltest du genau das finden was du suchst. falls nicht, einfach nochmal bescheid sagen



Ich versteh nicht, was ich davon machen soll. Das:

```
# drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer);  
#   
#     g.drawImage(<i>The Source Image</i>, 0, 0, <i>image width</i>, <i>image height</i>, <i>image width</i>, 0, 0, <i>image height</i>, null);  
#     <b><i>as opposed to the unflipped way</i></b>  
#   
#     g.drawImage(<i>The Source Image</i>, 0, 0, <i>image width</i>, <i>image height</i>, 0, 0, <i>image width</i>, <i>image height</i>, null);
```

oder das:


```
1. public static BufferedImage horizontalflip(BufferedImage img) {  
   2.         int w = img.getWidth();  
   3.         int h = img.getHeight();  
   4.         BufferedImage dimg = new BufferedImage(w, h, img.getType());  
   5.         Graphics2D g = dimg.createGraphics();  
   6.         g.drawImage(img, 0, 0, w, h, w, 0, 0, h, null);  
   7.         g.dispose();  
   8.         return dimg;  
   9.     }
```

Das erste hab ich ja eigentlich schon ausprobiert, aber wozu soll jetzt das zweite gut sein (wozu z.B. return dimg ???)? Ich blick da grad gar nicht durch ???:L


----------



## Atze (17. Apr 2011)

also das erste ist die signatur der drawImage methode.  damit musst du nichts machen

ich habs jetzt selber nicht probiert, aber die methode 
	
	
	
	





```
horizontalflip(BufferedImage img)
```
 sollte ein bufferedImage erwarten und es dir gespiegelt zurückgeben


----------



## ganonlight (18. Apr 2011)

Soll ich dann alle Image- in BufferedImage-Objekte ändern?


----------



## Atze (18. Apr 2011)

wenn du damit arbeiten willst, ja. image ist weit weniger mächtig

Image (Java Platform SE 6)

BufferedImage (Java Platform SE 6)


----------



## ganonlight (18. Apr 2011)

Ok, ich hab da grad nur ein Problem:
Vorher hab ich das Image einfach so erstellt:

```
bildName = "xy.png";
ImageIcon b = new ImageIcon( getClass().getResource( bildName ) );
bild = b.getImage();
```
Aber wie mach ich das denn bei BufferedImage? Ich find da grad nix.


----------



## Atze (18. Apr 2011)

bspw so 


```
BufferedImage image = ImageIO.read(url);
```


----------



## ganonlight (18. Apr 2011)

Hmmm.. aber wie kann ich damit dann ,wie vorher, ein Bild aus dem src-Ordner benutzen?
 Habs nicht hingekriegt, irgendwie ist mir das grad zu hoch.


----------



## Atze (18. Apr 2011)

Lesson: Working with Images (The Java™ Tutorials > 2D Graphics)


----------



## ganonlight (18. Apr 2011)

Laut der Seite sollte es so gehn:

```
BufferedImage bild = null;
        try {
            bild = ImageIO.read( new File( bildName ) );
        }
        catch (IOException e){
            System.out.println( "War wohl nix!" );
        }
```

Tuts aber nicht. es kommt immer nur "War wohl nix!".


----------



## Marco13 (19. Apr 2011)

e.printStackTrace();
liefert manchmal hildreiche Infos (in diesem Fall wohl nicht, nur allgemein).

new File(*"./src/"+*bildName )
sollte gehen. Allerdings legt man Bilder i.a. nicht ins "src", sondern in ein Unterverzeichnis wie "data" oder "images". Wenn das ganze später ein Applet werden soll, sag bescheid, da muss man ein bißchen aufpassen.


----------



## ganonlight (19. Apr 2011)

Weiß gar nicht genau, was ein Applet ist, wahrscheinlich nicht.^^'
Aber das funktioniert jetzt schon mal, danke an euch^^
Allerdings hab ich jetzt schon wieder ein Problem:

```
public static BufferedImage spiegeln( BufferedImage b ) {
        int w = b.getWidth();
        int h = b.getHeight();
        BufferedImage dimg = new BufferedImage( w, h, b.getType() );
        Graphics2D g = dimg.createGraphics();
        g.drawImage( b, 0, 0, w, h, w, 0, 0, h, null );
        g.dispose();
        return dimg;
   }
```

Hier krieg ich die Fehlermeldung:

```
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Unknown image type 0
        at java.awt.image.BufferedImage.<init>(BufferedImage.java:492)
        at Zeichenflaeche.spiegeln(Zeichenflaeche.java:45)
        at Zeichenflaeche.paintComponent(Zeichenflaeche.java:35)
        at javax.swing.JComponent.paint(JComponent.java:1006)
        at javax.swing.JComponent.paintChildren(JComponent.java:843)
```

"at Zeichenflaeche.spiegeln(Zeichenflaeche.java:45)" bezieht sich auf die Zeile 4 oben im Java-Code.


----------



## AmunRa (19. Apr 2011)

Diese Fehlermeldung hab ich auch öffters mal bekommen, wenn ich kein JPG Bild gelesen habe, sondenr ein GIF oder was anderes Leg dein BufferedImage am Besten mit diesem Typ an

```
BufferedImage dimg = new BufferedImage( w, h, BufferedImage.TYPE_INT_ARGB);
```


----------



## Marco13 (19. Apr 2011)

Die "0" steht AFAIR für einen "Custom Type" - das kann mal vorkommen. BufferedImage.TYPE_INT_ARGB ist schon OK.


----------



## Atze (19. Apr 2011)

ja, rbg ist schon völlig ok, ist es wahrscheinlich eh in den meisten fällen. les es dann halt vorher aus, wenns != 0 ist kannst es ja setzten. falls es null ist, einfach rgb reinsetzten. oder grundsätzlich rgb und verzichte auf das auslesen, wenns nie was spezielles ist.


----------



## ganonlight (19. Apr 2011)

AmunRa hat gesagt.:


> Diese Fehlermeldung hab ich auch öffters mal bekommen, wenn ich kein JPG Bild gelesen habe, sondenr ein GIF oder was anderes Leg dein BufferedImage am Besten mit diesem Typ an
> 
> ```
> BufferedImage dimg = new BufferedImage( w, h, BufferedImage.TYPE_INT_ARGB);
> ```



Stimmt, ich hab immer .png genommen.
Jetzt klappt alles, danke nochmal an euch


----------

