Java Problem mit Bilddarstellung

Black_Panter

Ensign
Registriert
Mai 2006
Beiträge
197
Hi,

wir haben in Programmierung ne Aufgabe bekommen, in der wir Bilder manipulieren sollen. (Ich bin 1. Semester)

Dazu haben wir von unserem Prof folgenden Code bekommen:

Code:
 import java.awt.*;
    import java.awt.image.*;
    import javax.swing.*;

    public class PhotoHopp {
    public static void main(String[] args) {
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Image srcImage = toolkit.getImage("river.gif";

    ImageFilter colorfilter = new TestFilter();
    Image filteredImage = toolkit.createImage(
    new FilteredImageSource(srcImage.getSource(),colorfilter));
    JFrame srcFrame = new DisplayFrame(srcImage,0,0,500,200);
    JFrame filteredFrame = new DisplayFrame(filteredImage,0, 200, 500, 200);

    filteredFrame.setBackground(Color.red);


    Image srcImage2 = toolkit.getImage("farbenkreis_b.gif";

    Image filteredImage2 = toolkit.createImage(
    new FilteredImageSource(srcImage2.getSource(),colorfilter));
    JFrame srcFrame2 = new DisplayFrame(srcImage2, 500, 0, 200, 200);
    JFrame filteredFrame2 = new DisplayFrame(filteredImage2, 500, 200, 200, 200);

    filteredFrame2.setBackground(Color.red);
    }
    }

    class DisplayFrame extends JFrame {
    private Image image;
    int x,y,b,h;

    public DisplayFrame(Image image, int x, int y, int b, int h) {
    this.image = image;
    this.x = x;
    this.y = y;
    this.b = b;
    this.h = h;
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setBounds(x,y,b,h);
    this.setVisible(true);
    }

    public void paint(Graphics g) {
    g.drawImage(image, 0, 0,b, h, this);
    }
    }



    class TestFilter extends RGBImageFilter {

    public int filterRGB(int x, int y, int pixel) {
    int filteredPixel;

    // enjoy working with pixels here
    // as an example extract one color part
    filteredPixel = (pixel & 0xff0000ff);

    return filteredPixel;
    }
    }



Der Teil den wir bearbeiten sollen ist die Methode filterRGB().

Die beiden angegebenen Bilder liegen im selben Ordner wie die .class-Dateien.

Das Problem ist, das mir die beiden Bilder nicht angzeigt werden.

Wo liegt der Fehler?

WICHTIG: Der Code stammt nicht von mir, sondern von meinem Prof! Sodass ich auch nur ne ansatzweise Ahnung hab was eigendlich passiert.

Wer sich für die Aufgabe interessiert kann sich diese unter http://www.hs-augsburg.de/~meixner/prog/prog1praktikum/prog1aufg4.htm

Und ich möchte keine Lösung für die Aufgaben sondern, hilfe bei dem Problem, dass mir die Bilder net angezeigt werden.

Grüße
Sören

Die zu verwendenen Bilder:

Bild 1:
river.gif

Bild 2:
farbenkreis_b.gif
 
Zuletzt bearbeitet:
den link, den du hier gepostet hast, funktioniert leider nicht, die Bilder werden jedoch in der Zeile
Image srcImage = toolkit.getImage("river.gif";
und
Image srcImage2 = toolkit.getImage("farbenkreis_b.gif";

geladen, da fehlt jeweils die schließende klammer
Image srcImage2 = toolkit.getImage("farbenkreis_b.gif");

Ansonsten mal überprüfen welches das Working Verzeichnis ist, das ist meißt das Verzeichnis in dem du das Programm aufrufst.
Mit welchem IDE arbeitest du? Eclipse / VS / ... und welches OS Unix /Win?

Also, hab den Quellcode mal kruz getestet und bis auf die fehlenden Klammern läuft der gut
Foto0014_cr.jpg

wie man im Screenshot gut sieht, liegen die Bilder im Arbeitsverzeichnis (Eclipse unter Win 32 Bit), die schon erwähnten Klammern wurden ergänzt
Wenn du weiter Probs hast, meld dich einfach nochmal kurz mit den Infos OS/IDE, dann kann man dir kurz das entsprechende Projekt zuschicken. Wenn du probleme mit der Arbeit ansich hast, müsstest du nochmal kurz schreiben was man machen soll.

Die Bilder auf andere Farben zu filtern, ist nicht so schwer
 
Zuletzt bearbeitet: (update)
Wenn ich nur die Klammern ergänzt habe, wurden mir die Bilder nur dann angezeigt wenn ich den absoluten Pfad zu den Bilder angegeben habe. Bilder und .class liegen aber im gleichen Ordner.
Ich versteh jetzt nur nicht, wieso ich den absoluten Pfad angeben muss.

Gruß
Sören
 
wie schon erwähnt, das liegt am Arbeitsverzeichnis. Die Bilder müssen in dem Verzeichnis liegen, von dem aus das Programm gestartet wird und nicht in dem Verzeichnis in dem die class Bytecodedatei liegen.

kleines Bsp.

In

C:\Users\Administrator\workspace\test2CB

liegen die Bilder

In

C:\Users\Administrator\workspace\test2CB\bin

liegen die class Dateien

Führe ich das Programm im Verzeichnis "C:\Users\Administrator\workspace\test2CB" aus, findet er die Bilder. Führe ich das Programm in "C:\Users\Administrator\workspace\test2CB\bin" aus, muss ich die Bilder ins bin Verzeichnis kopieren, oder im Programmcode den absoluten Pfad an geben
 
Okay. Das Pfadürpböem habe ich jetzt gelöst und bin bis auf eine Teilaufgabe auch mit allem fertig.

Aufgabe:
Neben dem Pixelfarbwert stehen Ihnen in der Methode filterRGB() über die Variablen x und y auch die Kordinaten des aktuell bearbeiteten Pixels zur Verfügung. Nutzen Sie diese Information aus, um weitere Bildmanipulationen durchzuführen. (Die Größe des Bildes und damit auch den Mittelpunkt können Sie notfalls durch Laden in ein Programm wie Windows-Paint ausmessen).
Mögliche Aufgaben (mindestens eine davon ist zu realisieren):

* Nur ein Teilrechteck aus dem Gesamtbild darstellen, Rest dunkel oder hell.
* Das Bild überlagern mit einem Kreuz bestehend aus den Bilddiagonalen (in irgend einer Farbe).
Das ist ein Beispiel für ein einfaches "Wasserzeichen" im Bild. Wer sich dafür bereits gewappnet fühlt, kann ein aufwändigeres Wasserzeichen einführen, dessen geometrische Form durch eine handhabbare Formel auf Basis von x und y gegeben ist.
* Lassen Sie die Helligkeit vom Zentrum aus zunehmen, bis am Rand die Pixel alle vollen Wert (alternativ 0-Wert) besitzten (Fading).
* Ihre eigene Idee!?!

Das Problem was sich mir stellt is, dass wir nur in der Methode "filterRGB" was ändern dürfen, ich aber gerne die länge und breite des Bildes auslesen würde, da ich gern die Aufgabe unabhängig von der Pixelanzahl des Bildes lösen möchte und nicht für jedes Bild per Hand die Pixel "zählen" möchte.

Gibt es eine möglichkeit dies in der Methode filterRGB auszulesen oder ist das in dieser Aufgabenstellung nicht möglich?

Am besten sieht man das Denk ich an den beiden Bildern die wir vom Prof bekommen haben.
-river.gif: 375 x 185 pixel
-farbenkreis_b.gif: 207 x 200 pixel

Grüß
Sören
 
Also das Auslesen der Höhe und Breite geht nur über umwege und du würdest Globale Variablen benötigen. Ich verstehe die Aufgabe eher so das die manipulationen in der Methode filterRGB() gemacht werden sollen und die höhe und Breite darfst du auslesen wo du willst. Er sagt ja auch das man's zur Not mit Paint machen darf, das wär ja dann auch nicht im filterRGB().

Zur begründung, der Filter wird ja für jedes einzelne Pixel neu iniziiert, man müßte als entweder ne Globale Variable mit führen, damit die Infos nicht jedesmal verloren gehen und auf die Classe mit dem Bild zugreifen, die ist ja aber als private deklariet, geht also auch nicht.
 
Zurück
Oben