Bild in einer Variable speichern

Status
Nicht offen für weitere Antworten.

smf68

Mitglied
Hi,
Ich versuche nun schon seit Stunden, auf alle mögliche Arten und Weisen Bilder zu laden und in einem Array zu speichern, damit ich sie nachher auf den Bildschirm zeichnen kann.
Ein Bild soll aber nicht nur geladen werden, sondern mit einem CropImageFilter auch noch in 12 Teile zerschnitten werden, diese 12 Teile kommen dann ins Array.

Das sieht im Groben so aus:
Code:
class  Game
{
	Image[] imgloaded, cutted;

	class GameLoop extends Thread
	{
		while(true)
		{
			// Graphics holen: offg

			offg.drawImage(imgloaded[0], 100, 100, frame);					
			offg.drawImage(cutted[2], 200, 200, frame);
		}
	}

	Game()
	{
		// Thread starten
		// loader und cutter erstellen, etc.

		String[] files = {"char1.png"};

		imgloaded = loader.load(files); // Lädt Bilder mit Mediatracker und gibt sie als Array zurück

		cutted = cutter.cut(imgloaded[0]); // Zerschneidet ein Bild in 12 Teile
	}
}

Und jetzt das paradoxe: So wie es hier steht, funktioniert das Programm. Wenn ich aber das erste drawImage auskommentiere (was in der fertigen Version ja so sein soll, ich brauche imgloaded nur, um es zu zerschneiden - angezeigt werden soll es nie!), kriege ich einen weissen Bildschirm.

Weshalb?

Wie kann ich Bilder in einer Variabeln so speichern, dass sie IMMER da sind, wenn immer ich Lust habe, sie zu zeichnen? Ich dachte eigentlich, dass der MediaTracker genau das macht.
Ich möchte Bilder nicht nur erstellen und sofort zeichnen, sondern auch aufbewahren, an andere Klassen weitergeben, etc..

Was mache ich falsch?

Wäre echt froh, wenn mir jemand dabei helfen könnte... ich bin am Verzweifeln.

Gruss smf68
 

Campino

Top Contributor
Es wäre schön mal den Code der cutter.cut() und der loader.load()-methode zu sehen, so ist der Code wenig aussagekräftig, spontan würde ich sagen, dass die cutter.cut nicht geht und das cutted-Array leer ist. Ansonsten malst du generell nur einen deiner zwölf Teile, das ist dir klar?
 
S

SlaterB

Gast
versuchs doch erstmal mit
cutted = new Image[3];
cutted[2] = imgloaded[0];

und der Anzeige von cutted[2] in Originalgröße,
wenn das funktioniert, dann ist wohl etwas mit der cut-Operation im Eimer,
was immer das auch sein soll
 

smf68

Mitglied
SlaterB hat gesagt.:
versuchs doch erstmal mit
cutted = new Image[3];
cutted[2] = imgloaded[0];

und der Anzeige von cutted[2] in Originalgröße,
wenn das funktioniert, dann ist wohl etwas mit der cut-Operation im Eimer,
was immer das auch sein soll

Das funktioniert.


Hier also die cut-Funktion

Code:
public Image[] cut(Image inp)
{
	Image[] result = new Image[12];

	int x = 0;
	int y = 0;

	for(int i=0;i<4;i++)
	{
		for(int j=0;j<3;j++)
		{
			filter = new CropImageFilter(x, y, 24, 32);
			result[i * 3 + j] = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(inp.getSource(), filter));

			x += 24;
		}
		y += 32;
	}

	return result;
}


Nun ist mir noch etwas sehr seltsames aufgefallen: Wenn ich beides zeichne wird imgloaded[0] immer gezeichnet, cutted[2] jedoch nur manchmal, manchmal aber auch gar nicht beim abwechselnden Starten und Beenden des Programmes. Also so:

Code:
offg.drawImage(imgloaded[0], 10, 10, frame);					
offg.drawImage(cutted[2], 10, 200, frame);


Tritt der Fehler womöglich schon beim Laden auf?

Hier die load-Funktion:


Code:
class ImageLoader
{
	private MediaTracker tracker;

	ImageLoader(Component c_parent)
	{
		tracker = new MediaTracker(c_parent);
	}

	public Image[] load(String[] filenames)
	{
		Image[] imgs = new Image[filenames.length];

		for(int i=0;i<filenames.length;i++)
		{
			imgs[i] = Toolkit.getDefaultToolkit().getImage(filenames[i]);
			tracker.addImage(imgs[i], 0);
		}

		try
		{
			while(tracker.statusAll(true) != MediaTracker.COMPLETE)
			{
				LoadingStatus.status = "Loading image files...";
				tracker.waitForAll();
			}
		}
		catch(InterruptedException e)
		{
			System.exit(0);
		}

		return imgs;
	}

Danke für die Hilfe!

Gruss smf68
 

smf68

Mitglied
Hab mich nochmal drangesetzt, das Problem ist zwar noch immer ungelöst, aber elegant umgangen.

Zuerst einmal hatte cut() einen Fehler:

Code:
public Image[] cut(Image inp)
{
   Image[] result = new Image[12];

   int x = 0;
   int y = 0;

   for(int i=0;i<4;i++)
   {
      for(int j=0;j<3;j++)
      {
         filter = new CropImageFilter(x, y, 24, 32);
         result[i * 3 + j] = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(inp.getSource(), filter));

         x += 24;
      }
      x = 0; // <------- das hatte gefehlt
      y += 32;
   }

   return result;
}

Geholfen hat das alleine aber noch nicht, immernoch die gleichen seltsamen Vorkommnisse - einmal gehts, einmal nicht.
Ich habe nun das ganze Programm umgeschrieben, MediaTracker über den Haufen geworfen und ImageIO benutzt. Jedes Bild wird nach dem CropImageFiltern direkt in ein BufferedImage geschrieben, und jetzt funktioniert es.
Ich kann mir zwar immer noch nicht vorstellen, wieso das mit Image nicht lösbar sein soll, aber naja...

Gruss smf68
 

kaie

Bekanntes Mitglied
Wie so oft auch hier: asynchrones Laden der Bilder! Die Bilder werden in einem separaten Thread geladen. Warte entweder, bis Dein Bild geladen wurde (mit MediaTracker) oder benutze direkt ein synchronisiertes Laden, z.B. mit ImageIO.
 

smf68

Mitglied
Das tue ich jetzt ja auch. Seltsam ist nur, dass ich auch nach geraumer Zeit nichts angezeigt bekam...

Was ich auch gelesen habe ist, dass ein Image-Objekt angeblich nur einmal gezeichnet werden kann, irgendwie aber kaum vorstellbar, weil ich sonst ja gar nie etwas angezeigt bekommen hätte (bzw ziemlich kurz bei einer Framerate von 75). Habe auch in der Doku nichts dazu gefunden.

Immerhin gehts jetzt ja, ich werde einfach in Zukunft die Finger ganz von Image lassen und nur noch BufferedImage benutzen, damit hatte ich jetzt bei all meinen Tests gar keine Probleme.

Gruss smf68
 

kaie

Bekanntes Mitglied
'tschuldigung, hatte Deinen Thread nur kurz überflogen, und sofort hat der Pawlowsche "Mediatracker"-Reflex eingesetzt! Dafür als Entschädigung eine eigene cut-Methode, die hoffentlich besser funktionieren dürfte:

Code:
public Image[] zerteileBild( String dateiname, int xTeile, int yTeile )
{
    try
    {
        BufferedImage bi = ImageIO.read( new File(dateiname) );
        int w = bi.getWidth(null)/xTeile;
        int h = bi.getWidth(null)/yTeile;
        Image[] erg = new Image[xTeile*yTeile];
        int nr=0;
        for( int y=0; y<yTeile; y++ )
        {
            for( int x=0; x<xTeile; x++ )
            {
                erg[nr] = new BufferedImage( w, h, BufferedImage.TYPE_INT_RGB );
                erg[nr].getGraphics.drawImage( bi, 0, 0, w, h, w*x, h*y, w*(x+1), h*(y+1) );
            }
        }
        return erg;
    } catch( Exception e ) { return null; }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Bild in einer Datenbank speichern? AWT, Swing, JavaFX & SWT 7
F Verschieben einer Messnadel auf einem Bild AWT, Swing, JavaFX & SWT 2
S JList Bild und Text in einer Zeile AWT, Swing, JavaFX & SWT 2
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
frager2345 Bild aus Dateien lesen und als Hintergrund verwenden AWT, Swing, JavaFX & SWT 2
T Bild in ein graphics füllen AWT, Swing, JavaFX & SWT 2
N imageIcon zeigt kein Bild an AWT, Swing, JavaFX & SWT 5
B Bild lädt nicht AWT, Swing, JavaFX & SWT 2
izoards Bild ausdrucken - PageFormat setzen geht nicht AWT, Swing, JavaFX & SWT 5
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
V JavaFX Bild leer und keine Fehlermeldung AWT, Swing, JavaFX & SWT 21
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
D JavaFX Größe des Bild an ImageView anpassen AWT, Swing, JavaFX & SWT 3
M Bewegtes Bild im BorderLayout.CENTER AWT, Swing, JavaFX & SWT 6
C Falschfarbenbild (lineare Grauwertspreizung)aus Grauwert-Bild erstellen AWT, Swing, JavaFX & SWT 15
C Kleineres Bild an bestimmte Koordinaten setzen AWT, Swing, JavaFX & SWT 6
S Bild neu skalieren - Bild in Bild speichern? AWT, Swing, JavaFX & SWT 6
N Bild Drehen AWT, Swing, JavaFX & SWT 1
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
J Bild von anderer Klasse will nicht laden AWT, Swing, JavaFX & SWT 1
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
T JFrame Bild einfügen AWT, Swing, JavaFX & SWT 9
M Combobox bild anklicken AWT, Swing, JavaFX & SWT 2
cool_brivk24 Swing ImageIcon lädt kein Bild AWT, Swing, JavaFX & SWT 12
L Bild nicht in der Mitte AWT, Swing, JavaFX & SWT 16
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
J Swing Bild in Button AWT, Swing, JavaFX & SWT 11
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
T Image Loader lädt Bild nicht AWT, Swing, JavaFX & SWT 10
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
T JavaFX Bild in Tabellenzelle AWT, Swing, JavaFX & SWT 2
Ksanatos Swing Bild (.jpg) einlesen und per Button wechseln AWT, Swing, JavaFX & SWT 9
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
MaxG. Swing Bild Button AWT, Swing, JavaFX & SWT 7
P Swing Bild Skallieren AWT, Swing, JavaFX & SWT 1
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
A Swing Bild wird nicht mehr geladen AWT, Swing, JavaFX & SWT 4
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
S Bild mit ImageIcon auf GUI verkleinern AWT, Swing, JavaFX & SWT 3
T AWT Farben in einem Bild ändern AWT, Swing, JavaFX & SWT 8
I JFrame Bild strecken und auf Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 2
F Gezeichnetes als bild speichern AWT, Swing, JavaFX & SWT 4
B 2D-Grafik Bild farblich filtern AWT, Swing, JavaFX & SWT 2
B JavaFX ImageView neues Bild zuweisen AWT, Swing, JavaFX & SWT 19
A 2D-Grafik Bild wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 24
K Bild in JFrame AWT, Swing, JavaFX & SWT 2
S JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen AWT, Swing, JavaFX & SWT 8
B Swing Unterteiltes JFrame mit Bild in der Mitte AWT, Swing, JavaFX & SWT 4
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
Z Bildervorschau, MouseDragged das Bild verschieben AWT, Swing, JavaFX & SWT 1
M JavaFX Ein Bild ohne Rahmen fällt runter? AWT, Swing, JavaFX & SWT 2
G Anonyme Instanz von JXImageView erstellen und mit Bild initialisieren AWT, Swing, JavaFX & SWT 7
A JPanel Bild laden (Porblem mit Dateipfad) AWT, Swing, JavaFX & SWT 2
M JavaFX - Bild in Jar einbinden, sodass es auch außerhalb der IDE geladen wird. AWT, Swing, JavaFX & SWT 2
M Bild Beschreibung mit ImageIO speichern AWT, Swing, JavaFX & SWT 1
M "ImageIO.read()" liest Bild nicht richtig ein AWT, Swing, JavaFX & SWT 3
I Swing JLabel Bild für 1sec anzeigen lassen AWT, Swing, JavaFX & SWT 13
K Bild in Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
C GUI öfters durchlaufen und hinterher Bild speichern AWT, Swing, JavaFX & SWT 1
M AWT Farben in Bild ersetzen AWT, Swing, JavaFX & SWT 11
E JavaFX Bild einfügen AWT, Swing, JavaFX & SWT 6
G paintComponents zerstückelt Bild AWT, Swing, JavaFX & SWT 0
C 2D Grafik ein Bild soll permanent durchlaufen AWT, Swing, JavaFX & SWT 2
1 Textfield: jede Buchstabe ein Bild AWT, Swing, JavaFX & SWT 2
C Bild Koordinaten AWT, Swing, JavaFX & SWT 6
M Bild aus JLabel resizen und speichern AWT, Swing, JavaFX & SWT 0
M Bild in JPanel mit Maus einfügen AWT, Swing, JavaFX & SWT 0
B JPanel und png-Bild AWT, Swing, JavaFX & SWT 2
B Swing Bild von Webseite herunterladen, diese dann in JList anzeigen. AWT, Swing, JavaFX & SWT 1
O 2D-Grafik Bild abgeschnitten nach Rotation mit Affine Transform und Hintergrund Schwarz AWT, Swing, JavaFX & SWT 8
A Swing Malprogramm Bild speichern? AWT, Swing, JavaFX & SWT 9
U Bild innerhalb hatml code anzeigen AWT, Swing, JavaFX & SWT 5
Y JavaFX Bild speichern und Pfad dazu abspeichern AWT, Swing, JavaFX & SWT 2
S Geladenes Bild wird nicht in JPanel angezeigt AWT, Swing, JavaFX & SWT 7
L 2D-Grafik Bild in Richtung Maus drehen AWT, Swing, JavaFX & SWT 18
C Bild in JFrame AWT, Swing, JavaFX & SWT 8
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
I SWT Bilder, bzw. ein einzelnes Bild AWT, Swing, JavaFX & SWT 6
L JavaFX: Bild in Image einlesen AWT, Swing, JavaFX & SWT 11
T Mit getSubimage ruckelt das Bild AWT, Swing, JavaFX & SWT 7
T Bild drehen ohne Resize AWT, Swing, JavaFX & SWT 3
A Bild in JLabel skalieren AWT, Swing, JavaFX & SWT 4
A Bild über Imageviewer auf GUI anzeigen AWT, Swing, JavaFX & SWT 3
D 3D-Grafik [JOGL] streifen im bild AWT, Swing, JavaFX & SWT 2
D Bild bewegen mit Tastendruck AWT, Swing, JavaFX & SWT 7
H Bild wird nicht angezeigt, Fehlercode unverständlich AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Bildteile in ein anderes Bild speichern AWT, Swing, JavaFX & SWT 12
C Swing ImageIcon mit Bild aus Temp-Verzeichniss füllen AWT, Swing, JavaFX & SWT 15
J Swing Bild laden, Kreise drin malen, Schreiben AWT, Swing, JavaFX & SWT 2
S Bild skalieren AWT, Swing, JavaFX & SWT 3
D Bild in JFrame nur kurz da AWT, Swing, JavaFX & SWT 9
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
GianaSisters Bild wird S/W gespeichert. AWT, Swing, JavaFX & SWT 4
O Bild auf das JLabel AWT, Swing, JavaFX & SWT 10
D Swing Text auf Bild legen AWT, Swing, JavaFX & SWT 7
S Ein externes Bild in ein JFrame einfügen AWT, Swing, JavaFX & SWT 8
J Swing Bild wird nicht auf JLabel angezeigt AWT, Swing, JavaFX & SWT 12

Ähnliche Java Themen

Neue Themen


Oben