Bild direkt im Quelltext erstellen

Blackhole16

Bekanntes Mitglied
Liebes java-forum,

Ich glaube, eine sehr kranke Idee zu haben :autsch: . Der Hintergrund dazu ist, dass ich ein Applet habe, in dem ich Bilder darstelle, die in der Jar hinterlegt sind. Leider dauert das Laden der Jar-Dati und damit des gesamten Applets sehr lange.

Nun habe ich überlegt, die Bilder gleich im Quelltext von Java zu erstellen. Ich glaube mich daran zu erinnern, dass ich das schon mal irgendwo gesehen hab, finde es aber nicht mehr...

0. Ist die Idee zu krank?!? 😉
1. Würde das länger dauern, als die Bilder in der Jar mitzuladen?
2. Wie speicher ich das im Quelltext? (vllt. mit Byte[] ?)
3. Wie lade ich das richtig?

mfg
BH16
 
warum sollte das Erstellen eines Bildes im Code schneller gehen als das Laden eines fertigen Bildes?
Wird nicht die ganze Jar beim laden der Seite geladen? Oder werden die benötigten Klassen erst wenn sie gebraucht sind geladen?

Man kann die Bilder ja im Hintergrund laden und die ersten Bilder bereits anzeigen, sobald diese geladen sind.
Möglichkeiten Bilder zu laden:
Grafikdateien laden und anzeigen ? Byte-Welt Wiki
klingt logisch, damit werde ich mich mal genauer befassen 🙂
Aber dann müsste ich die Bilder ja aus der Jar herausnehmen und irgendwo auf dem Server, auf dem auch die Jar liegt speichern. Kann ich dann auch noch darauf zugreifen oder kommt dann eine SecurityException?

Mir gehts jetzt trotzdem noch ums Prinzip 😉

Auf Basis welcher Infos bzw. wie willst Du denn ein Bild erstellen?

Ein Bild wird aus einer Datei geladen. Dazu muss die Datei von JAVA irgendwo zwischengespeichert werden (in byte[] ?). Kann ich nicht diese Zwischenspeicherungsdatei im Quelltext direkt erzeugen?

mfg
BH16
 
Aber dann müsste ich die Bilder ja aus der Jar herausnehmen und irgendwo auf dem Server, auf dem auch die Jar liegt speichern.
...
Ein Bild wird aus einer Datei geladen. Dazu muss die Datei von JAVA irgendwo zwischengespeichert werden (in byte[] ?).
Die Bilder können im jar bleiben (s. meinen Link zum Laden der Bilder). Die Bilder werden auch nirgends zwischengespeichert. Sie werden direkt in den Arbeitsspeicher geladen.
 
Das einzige was imho sinnmacht ist die Bilder aus der jar rauszunehmen, weil dann das jar schneller geladen wird und startet und du die bilder dann mit der Zeit nachladen kannst. Wenn du übrigens auf irgendeine Resource des Ursprungsservers des Applets zugreifst fliegt keine SecurityException.
 
Muss es denn als Applet laufen? Oder wäre Java Webstart eine mögliche Alternative?
Bei Java Webstart hatt man den Vorteil, das die jar Datei nur beim ersten Aufruf zum Client transportiert wird.
Für alle folgenden Aufrufe wird das jar auf dem client zwischengespeichert.
Lediglich wenn es mal eine neue jar Version gibt wird erneut heruntergelden.
Das spart bei großen jar Dateien ne Menge Zeit.
 
Die Bilder können im jar bleiben.
So hab ich es bisher auch, nur leider wird die gesamte Jar geladen, bevor sich das applet überhaupt erst öffnet. Somit dauert das Laden schon ewig.
Die Bilder werden auch nirgends zwischengespeichert. Sie werden direkt in den Arbeitsspeicher geladen.
Achso... Gut zu wissen... Also lässt sich meine Idee nicht realisieren. Schade...
Auf jeden Fall habe ich wieder was neues gelernt. Und diese Frage hat mich schon echt lange beschäftigt 😉

Das einzige was imho sinnmacht ist die Bilder aus der jar rauszunehmen, weil dann das jar schneller geladen wird und startet und du die bilder dann mit der Zeit nachladen kannst. Wenn du übrigens auf irgendeine Resource des Ursprungsservers des Applets zugreifst fliegt keine SecurityException.
Das ist eine gute Idee. Ich denke, dass ich das mithilfe Michael...s link auch mit einem relativen Pfad zur Jar auf dem Server verwirklichen werde.

Muss es denn als Applet laufen? Oder wäre Java Webstart eine mögliche Alternative?
Bei Java Webstart hatt man den Vorteil, das die jar Datei nur beim ersten Aufruf zum Client transportiert wird.
Für alle folgenden Aufrufe wird das jar auf dem client zwischengespeichert.
Lediglich wenn es mal eine neue jar Version gibt wird erneut heruntergelden.
Das spart bei großen jar Dateien ne Menge Zeit.

Das ist natürlich auch eine gute Idee. Hast du dafür ein Tutorial (für dumme)? Muss ich da das Applet neu überarbeiten oder kann das so bleiben? Hat das mit viel Arbeit zu tun =? Denn die andere Variante von Kevin94 ist sehr einfach zu realisieren 🙂
Und Programmierer sind von Grund auf faul (warum schreiben sie sonst anstatt "i=i+5" "i+=5" ??? 😉 )

Ich danke euch Allen, dass ihr mir geholfen habt / helft, mein Applet schneller zu gestalten.

mfg
BH16
 
Das ist natürlich auch eine gute Idee. Hast du dafür ein Tutorial (für dumme)? Muss ich da das Applet neu überarbeiten oder kann das so bleiben? Hat das mit viel Arbeit zu tun =?
Ja ,du mußt etwas anders programmieren.
Es ist eine Umstellung, für die du erst mal neue Techniken kennenlernen müßtest.
Ein gutes Tutorial kenne ich leider nicht.
Auf der MyOggRadio Download Seite findest du aber ein Beispiel - Den IconEditor oder den JMyOggRadioPlayer.
Das Prinzip ist einfach.
Du erstellst eine normale Desktop Anwendung - kein Applet, die auf einem Web-Server abgelegt wird.
Dazu kommt dann eine jnlp Datei, die dein Projekt beschreibt.
Gestartet wird nicht per java ....class sondern per javaws ....jnlp
 
Hast du die Progs gemacht? Sieht echt cool aus 😉
Muss man die signieren lassen, odergeht es auch ohne?

Ich glaube, dass dies für meine Zwecke eine Übertreibung ist, ich kann mir aber vorstellen, dieses Prinzip bei manchen eignen Desktopanwendungen einzusetzen. Wenn ich Probleme dabei habe, wende ich mich nochmal an dich 🙂

Vielen Dank nochmal an alle, ich werde es so verwirklichen, dass ich die Bilder aus der Jar rausnehme und auf dem Server speichere und diese dann anchträglich nachlade.

mfg
BH16
 
Hast du die Progs gemacht? Sieht echt cool aus 😉
Danke für die Blumen. 🙂
Muss man die signieren lassen, odergeht es auch ohne?
Man muß nicht in jedem Fall signieren. Das ist ähnlich wie bei einem Applet. Das muß nur signiert werden, wenn du irgendwas mit dem Client PC machen willst.
Als Faustregel: Wenn das Applet nicht signiert ist, wird die entsprechende Webstart Anwendung auch nicht signiert.
 
Ja genau eine zeitgesteuerete Diashow. Allerdings ist das Problem, es sollte ein Timer rein der alles 5 sek die Bilder wechselt.
Das könnte als Schleife laufen und bei Mausbewegung beendet werden. Wie du ja am Code sehen kannst, sind zwei fenster auf getrennten Monitoren vorgesehen. Ich hoffe es macht Sinn alles in ein Java dokument zu coden.

Hab da mal was vorbereitet, aber wie ich´s weiter hinbekomme weis ich noch nicht -mal sehen, mit viel hilfe könnte es werden denke ich.

Java:
//Der Grundgedanke dieser Anwendung ist ein Timergesteuertes auslesen
//eines Ordners mit Bildern im Quer -und Langformat mit Ausgabe aus
//2 Bildschirmen (1 Grafikkarte). Vorab laden der Bilder in den Buffer
//maximal 2 damit alles Ruckelfrei präsentiert wird.
//Bilder wechseln alle 5 Sekunden.
//Die Präsentation wird über Tatsaturberührung/Mausbewegung abgebrochen.
//Format Hochkant wird automatisch links ausgegeben ist aber als Fenster
//immer Fullscreenund das Format Horizontal wird immer rechts augegeben
//format Fullscreen. Die Bilder werden generell zentriert dargestellt.
//Bildershow läuft als Schleife und kann unterbrochen werden.
package fullscreen;

import java.awt.*;
import java.io.*;
import java.awt.event.*;
import java.util.Timer.*;
import javax.swing.*;
import javax.management.timer.Timer;
import javax.imageio.ImageIO;

public class fenster implements MouseMotionListener, KeyListener {
  JFrame frame, frame2;
    /////////////Fenster 1////////////////////////////////////////
    public fenster() {
    frame = new JFrame("Test");
    //frame2 = new JFrame();
    
    Toolkit tk = Toolkit.getDefaultToolkit();
    int xSize = ((int) tk.getScreenSize().getWidth());
    int ySize = ((int) tk.getScreenSize().getHeight());
    
    //Content Pane 01
    frame.setUndecorated(true);
    //frame2.setUndecorated(true);
    frame.setSize(xSize,ySize);
    //frame2.setSize(xSize,ySize);
    frame.setVisible(true);
    //frame2.setVisible(true);
    frame.setLocation(0,0);
    //frame2.setLocation(1240,0);
    frame.addMouseMotionListener(this);
    //frame2.addMouseMotionListener(this);
    frame.addKeyListener(this);
    //frame2.addKeyListener(this);
    frame.getContentPane().addMouseMotionListener(this);
    //frame2.getContentPane().addMouseMotionListener(this);
    
    }
    public static void main(String[] args) throws IOException {
        fenster app = new fenster();
    }
    
    //Bilderordner sichten, Bilder auswerten, sortieren nach Länge/Breite
    //1Pfad zu Ordner und feststellen ob Seitenformat x>y || x<y;
    //Wenn Seitenformat x größer dann gebe auf Bildschirm 2 aus
    //sonst, gebe auf Bildschirm 1 aus.
    //Bildschirm Hochformat
    //lade jeweils 3 Bilder in Buffer (muss nicht syncronisiert werden),
    //Bildschirm Querformat
    //lade jeweils 3 Bilder in Buffer (muss nicht syncronisiert werden),
    
    
    //Bilder laden
    //Hole
       //File inputFile = new File("C:Desktop/bilder/*.*");
        
     
    
    
    
    
    //Fenster 2
   
    
    
    
    
    
    
    //Bildfenster schliesst bei Maus/Tastenevent
    @Override
    public void mouseDragged(MouseEvent arg0) {
	frame.dispose();
	//frame2.dispose();
    }
    @Override
    public void mouseMoved(MouseEvent arg0) {
	frame.dispose();
	//frame2.dispose();
    }
    @Override
    public void keyTyped(KeyEvent e) {
	frame.dispose();
	//frame2.dispose();
    }
    @Override
    public void keyPressed(KeyEvent e) {
        frame.dispose();
        //frame2.dispose();
    }
    @Override
    public void keyReleased(KeyEvent e) {
	frame.dispose();
	//frame2.dispose();
    }
}
 
Da hast Du ja viel vor und noch viele Probleme zu lösen.
Kann jetzt Deine Java Kenntnisse nicht einschätzen.

Hier mal ein möglicher Ansatz, der mit Bild Dummies (Rechtecken arbeitet) und nur das zeitgesteuerte Darstellen implementiert (ohne die vielen anderen Anforderungen):
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ScreenSaver {
	public static void main(String[] s) {
		new ScreenSaver();
	}
	
	private Rectangle[] imageDummy;
	private Rectangle displayedImage;

	public ScreenSaver() {
		JFrame frame = new JFrame();
		frame.setUndecorated(true);

		imageDummy = new Rectangle[15];
		
		GraphicsDevice[] gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
		System.out.println("number of screen devices: " + gd.length);
		
		int w = 0, h = 0;
		for (GraphicsDevice g : gd) {
			Rectangle rect = g.getDefaultConfiguration().getBounds();
			System.out.println(rect);
			w += rect.width;
			h = Math.max(h, rect.height);
		}
		
		final Random rnd = new Random();
		final Color[] color = new Color[]{Color.BLACK, Color.RED, Color.BLUE};
		final JPanel imgPanel = new JPanel() {
			public void paintComponent(Graphics g) {
				super.paintComponent(g);
				if (displayedImage==null)
					return;
				Graphics2D g2 = (Graphics2D)g.create();
				g2.setColor(color[rnd.nextInt(color.length)]);
				g2.fill(displayedImage);
				g2.dispose();
			}
		};
		frame.add(imgPanel);
		frame.setBounds(0, 0, w, h);
		frame.setVisible(true);
		
		frame.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				System.exit(0);
			}
		});
		
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			private int index;
			
			public void run() {
				if (imageDummy[index]!=null) {
					displayedImage = imageDummy[index];
					imgPanel.repaint();
					index= ++index%imageDummy.length;
				}
			}
		}, 0, 2000);
		
		new Thread(new Runnable() {
			public void run() {
				loadDummyImages();
			}
		}).start();
	}
	
	private void loadDummyImages() { //nur eine Dummy Methode, hier müssen eigentlich die Bilder geladen werden
		Random rnd = new Random();
		for (int i=0; i<imageDummy.length; i++) {
			if (i%2==0)
				imageDummy[i]= new Rectangle(rnd.nextInt(200) + 20, rnd.nextInt(200) + 20, rnd.nextInt(200) + 600, rnd.nextInt(200) + 300);
			else
				imageDummy[i]= new Rectangle(rnd.nextInt(200) + 1600, rnd.nextInt(200) + 20, rnd.nextInt(200) +600, rnd.nextInt(200) + 300);
			
			try {
				//kuenstliche Verzoegerung um das Laden der Bilder zu "simulieren"
				Thread.sleep(rnd.nextInt(3000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
 
Da hast Du ja viel vor und noch viele Probleme zu lösen.
Kann jetzt Deine Java Kenntnisse nicht einschätzen.

Hier mal ein möglicher Ansatz, der mit Bild Dummies (Rechtecken arbeitet) und nur das zeitgesteuerte Darstellen implementiert (ohne die vielen anderen Anforderungen):
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ScreenSaver {
	public static void main(String[] s) {
		new ScreenSaver();
	}
	
	private Rectangle[] imageDummy;
	private Rectangle displayedImage;

	public ScreenSaver() {
		JFrame frame = new JFrame();
		frame.setUndecorated(true);

		imageDummy = new Rectangle[15];
		
		GraphicsDevice[] gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
		System.out.println("number of screen devices: " + gd.length);
		
		int w = 0, h = 0;
		for (GraphicsDevice g : gd) {
			Rectangle rect = g.getDefaultConfiguration().getBounds();
			System.out.println(rect);
			w += rect.width;
			h = Math.max(h, rect.height);
		}
		
		final Random rnd = new Random();
		final Color[] color = new Color[]{Color.BLACK, Color.RED, Color.BLUE};
		final JPanel imgPanel = new JPanel() {
			public void paintComponent(Graphics g) {
				super.paintComponent(g);
				if (displayedImage==null)
					return;
				Graphics2D g2 = (Graphics2D)g.create();
				g2.setColor(color[rnd.nextInt(color.length)]);
				g2.fill(displayedImage);
				g2.dispose();
			}
		};
		frame.add(imgPanel);
		frame.setBounds(0, 0, w, h);
		frame.setVisible(true);
		
		frame.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				System.exit(0);
			}
		});
		
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			private int index;
			
			public void run() {
				if (imageDummy[index]!=null) {
					displayedImage = imageDummy[index];
					imgPanel.repaint();
					index= ++index%imageDummy.length;
				}
			}
		}, 0, 2000);
		
		new Thread(new Runnable() {
			public void run() {
				loadDummyImages();
			}
		}).start();
	}
	
	private void loadDummyImages() { //nur eine Dummy Methode, hier müssen eigentlich die Bilder geladen werden
		Random rnd = new Random();
		for (int i=0; i<imageDummy.length; i++) {
			if (i%2==0)
				imageDummy[i]= new Rectangle(rnd.nextInt(200) + 20, rnd.nextInt(200) + 20, rnd.nextInt(200) + 600, rnd.nextInt(200) + 300);
			else
				imageDummy[i]= new Rectangle(rnd.nextInt(200) + 1600, rnd.nextInt(200) + 20, rnd.nextInt(200) +600, rnd.nextInt(200) + 300);
			
			try {
				//kuenstliche Verzoegerung um das Laden der Bilder zu "simulieren"
				Thread.sleep(rnd.nextInt(3000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

Ja das funzt schon mal klasse und ich werde dann schon mal versuchen das ganze auf zwei für links und rechts aufzuteilen da beide Bildschirme getrennt dargestellt werden müssen -also auch 2 Panels. auf jedenfall werde ich das Ergebniss dann hier wieder bereitstellen -vielleicht hilft es vielen, die ein ähnliches Projekt realisieren möchten. Bin schon viel weiter jetzt mit eurer tollen Hilfe hier.

Vielen Dank und ich halte euch auf dem Laufenden.
 

Zurück
Oben