kramann.info
© Guido Kramann

Login: Passwort:










15.1 Experiment 4: Übertragung eines Kamerabildes

15.1 (EN google-translate)

15.1 (PL google-translate)

Im folgenden Experiment soll das Bild einer USB-Kamera über das Internet übertragen werden. Als Zwischenschritt wird zunächst eine lokale Applikation umgesetzt, die immer wieder ein aufgefrischtes Bild als Datei abspeichert. Es wird im Verzeichnis htdocs abgelegt. Dadurch kann ein Client-Javaprogramm dieses Bild holen. Als Applet konnte dies nicht mit Erfolg umgesetzt werden, weil eine hinzugefügte Thread-Methode nicht parallel zum Hauptthread laufen konnte. Statt dessen wird hier der Client als Applikation umgesetzt. Ähnlich mächtig, wie die Methode getImage(URL), ist die Methode read(URL) der Klasse ImageIO, die hier verwendet wird.

Das Erfassen und Speichern des Bildes geschieht mit einem Beispielprogramm des Media-Frameworks "XUGGLER": in DisplayWebcamVideo.java wird an der Stelle, wo ein BufferedImage erstellt wird dieses mit Hilfe von ImageIO abgespeichert.

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.TextArea;
import java.awt.ScrollPane;
import java.awt.Image;
import java.net.URL;
import javax.swing.*;
import javax.imageio.ImageIO;


public class Bildholen extends Applet
{
    public int zaehler = 0;

    public Image bild = null;
    public String uebergabe = "";


    public void auffrischen()
    {
        try
        {
            bild = ImageIO.read(new URL("http://localhost/meinbild.png"));
            repaint();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }

    public void paint(Graphics g)
    {
        if(bild!=null)
            g.drawImage(bild, 0, 0, this); 

        g.drawString("Affrischung Nr."+zaehler,10,300);
        zaehler++;
    }


    public static void main(String[] args)
    {
        Bildholen hb = new Bildholen();

        hb.init();
        hb.start();
        hb.repaint();

        JFrame mF = new JFrame("Differentialgeometrie");
        mF.getContentPane().add(hb);
        mF.pack();
        mF.setSize(500,500);
        mF.setLocation(10,10);
        mF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mF.setVisible(true);

        while(true)
        {
             System.out.println(hb.zaehler);
             try
             {
                 hb.auffrischen();
                 Thread.sleep(500);
             }
             catch(Exception e)
             {
             }
        }
    }
}

Code 15.1-1: Java-Applikation Bildholen.

Übung
  • Testen Sie die vorgestellten Beispiele in einem W-LAN-Netz.
  • Versuchen Sie über UDP ein Bild als Bytestrom zu übertragen.
  • Siehe dazu UDP-Beispiel in der Vorlesung.
  • Idee:
  • createImageInputStream(Object input) : ImageInputStream aus ImageIO das BufferedImage übergeben.
  • Dann mit read(byte[] b) aus ImageInputStreamImpl das Bild in ein Byte-Array schreiben, dieses dann per UDP senden.
  • Beim Empfänger das gleiche umgekehrt durchführen.
material.zip - Beispielanwendungen.