Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

Java, Jimi, bmp und tga oeffnen





Frage

Hallo Ihrs! Ich schaetze, ich habe keine Ahnung, wie ich die Jimi-Bibliothek richtig anwende. Ich habe eine kleine Oberflaeche und will darin ein bmp- oder tga-Bild oeffnen und das in einem extra Fenster anzeigen. Dafuer habe ich eine Klasse LAInternalFrame geschrieben, die sich von JInternalFrame ableitet. Darin habe ich einen Konstruktor JInternalFrame(JFileChooser FileChooser_). Dieser Konstrukter wird von der Klasse LAGUI in deren Prozedur loadFromFile() aufgerufen, die im Grossen und Ganzen auch zu funktionieren scheint (hoffe ich). Zumindest gibt er die Fehler-Message korrekt aus ... Danke fuer Eure Bemuehungen! Schnoof

Antwort 1 von semi


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.sun.jimi.core.*;

public class ImagePanel extends JComponent {

  protected Image image;

  public ImagePanel(Image image) {
    super();
    this.image = image;
  }

  public Dimension getPreferredSize() {
    return (image==null)?new Dimension(0, 0):
            new Dimension(image.getWidth(null), image.getHeight(null));
  }

  public void paintComponent(Graphics g) {
    if (image != null) {
      g.drawImage(image, 0, 0, this);
    }
  }

  public static void main(String argv[]) {

    try {
      JFrame frame = new JFrame(argv[0]);
      frame.setBackground(Color.white);
      JScrollPane s = new JScrollPane();
      s.getViewport().setView(new ImagePanel(Jimi.getImage(argv[0])));
      frame.getContentPane().add(s);
      frame.addWindowListener(
        new WindowAdapter() {
          public void windowClosing(WindowEvent event) {
            System.exit(0);
          }
        }
      );
      frame.pack();
      frame.setVisible(true);
    }
    catch(Exception e) {
      System.out.println(e.getMessage());
      e.printStackTrace();
    }

  }

}


Compilieren:
javac -classpath .;JimiProClasses.zip; ImagePanel.java
Starten:
java -classpath .;JimiProClasses.zip; ImagePanel Grafikdatei

Gruß,
Michael

Antwort 2 von Schnoof

Danke, Michael!

Es ist nicht ganz das, was ich brauche, aber ich glaube, es hat mich einen Schritt weiter gebracht.

Ich muss eine vollstaendige Applikation entwickeln, mit der man eine Serie von Bildern (entweder bmp oder tga) laden und dann diese Bilder analysieren kann.

Jetzt will ich es erst mal hinkriegen, ein Bild zu oeffnen und innerhalb dieser Anwendung anzuzeigen - deshalb kein Frame sondern ein InternalFrame.

Die gesamte GUI moechte ich hier nun nicht posten, das waere etwas lang und sicher auch nicht notwendig. In der GUI gibt's folgende Prozedur:
private void loadFromFile()
{
JFileChooser FileChooser_ = new JFileChooser() ;
ExampleFileFilter FileFilter_ = new ExampleFileFilter() ;
FileFilter_.addExtension("bmp") ;
FileFilter_.addExtension("tga") ;
FileFilter_.setDescription("Bitmap & Targa Images") ;
FileChooser_.setFileFilter(FileFilter_) ;
FileChooser_.setDialogTitle("Lip Analyzer: Open Image") ;
if (FileChooser_.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
{
try
{
final LAInternalFrame InternalFrame_ ;
InternalFrame_ = new LAInternalFrame(FileChooser_) ;
LADesktopPane_.add(InternalFrame_) ;
InternalFrame_.addInternalFrameListener(new InternalFrameAdapter()
{
public void activatedInternalFrame(InternalFrameEvent e)
{
CurrentInternalFrame_ = InternalFrame_ ;
setActive() ;
}
public void deactivatedInternalFrame(InternalFrameEvent e)
{
setInactive() ;
}
public void closingInternalFrame(InternalFrameEvent e)
{
setInactive() ;
}
}) ;
InternalFrame_.show() ;
}
catch(Exception f)
{
showError("Cannot open image.") ;
}
}
}

Hier die LAInternalFrame:
package gui ;

import java.awt.* ;
//import java.lang.* ;
import javax.swing.* ;

import gui.* ;

import com.sun.jimi.core.* ;
import com.sun.jimi.core.decoder.bmp.* ;

/**
* Creating the internal frames for images and result text
* @author Inga Schulze
*/
public class LAInternalFrame extends JInternalFrame{
public boolean getMarkColour_ ;
public LAImagePanel ImagePanel_ ;
public Image Image_ ;
public Image InitialImage_ ;

/**
* Initializing of an InternalFrame for an image from the harddisk
*/
public LAInternalFrame(JFileChooser FileChooser_) throws Exception
{
super(FileChooser_.getSelectedFile().getName(), false, true, false, true) ;
Image_ = Jimi.getImage(FileChooser_.getSelectedFile().getAbsolutePath()) ;
ImagePanel_ = new LAImagePanel(Image_) ;
getContentPane().add(ImagePanel_) ;
InitialImage_ = Image_ ;
getMarkColour_ = false ;
}

// Hier kommt noch ein LAInternalFrame fuer Ergebnis

}

Und hier das LAImagePanel:
package gui ;

import java.awt.* ;
import javax.swing.* ;

/**
* LAImagePanel constructs a JPanel for showing the images
* @author Inga Schulze
*/
public class LAImagePanel extends JPanel{
Image Image_ ;

/**
* Constructor of the panel
* @param Image_ The image that shall be shown
*/
public LAImagePanel(Image Image_)
{
this.Image_ = Image_ ;
}

/**
* Gets the preferred Size of the image
*/
public Dimension getPreferredSize()
{
return (Image_ == null) ? new Dimension(0, 0):
new Dimension(Image_.getWidth(null), Image_.getHeight(null)) ;
}

/**
* Paints the image
* @param Graphics_ The Graphics Object that is painted
*/
public void paintComponent(Graphics Graphics_)
{
super.paintComponent(Graphics_) ;
Graphics_.drawImage(Image_, 0, 0, this) ;
}

}

Der ExampleFileFilter ist irgendwo bei Sun erhaeltlich.

Also, bis gestern hat er nur die Fehlermeldung ausgegeben. Nun, nachdem ich versucht habe, Michaels Loesung zu uebertragen, gibt er diese Fehlermeldung nicht mehr aus, bringt auch keinen Laufzeitfehler. Heisst das, er laedt was und zeigt es nur nicht an?

Bis denne!
Schnoof

Antwort 3 von semi

Ich tippe mal darauf, dass Du versuchst
Graphics.drawImage(....) aufzurufen, während die Grafik noch nicht geladen ist.
Füge den fett markierten Code in den Konstruktor der Klasse LAInternalFrame ein (direkt nach dem Jimi.getImage(...))
Image_ = Jimi.getImage(FileChooser_.getSelectedFile().getAbsolutePath()) ;
GraphicsUtils.waitForImage(new Canvas(), Image_);
und noch
import com.sun.jimi.core.util.*;

Ich hoffe es hilft.

Gruß,
Michael

Antwort 4 von Schnoof

Nochmals danke, aber das Ergebnis ist das gleiche ... Und ich soll das in einer Stunde vorweisen ... *heul* Ich haette nicht gedacht, dass es daran scheitern wuerde. Koennte ich woanders einen Fehler haben?

Danke!
Schnoof

Antwort 5 von Schnoof

Muss ich bmp oder tga vielleicht erst mal dekodieren?

Antwort 6 von semi

Du hast den falschen Zeitpunkt mit der Frage erwischt. Nach 18Uhr war ich unterwegs auf Heimfahrt.

Du hast irgendwas von Fehlern geschrieben, es wäre hilfreich, wenn Du die genaue Fehlermeldung bringen würdest.

Prüfe mal, ob die folgende Anweisung einen korrekten Dateinamen liefert bzw. ob die Erweiterung .bmp .tga dabei ist.
FileChooser_.getSelectedFile().getAbsolutePath()


Gruß,
Michael

Antwort 7 von Schnoof

Hallo Michael,

ich bin gerade im Praktikum in Brasilien, und da habe ich nun leider 5 Stunden Zeitverschiebung, weshalb meine Fragen alle zu etwas eigenartigen Zeiten fuer Arbeit kommen werden.

Wie dem auch sei, ich habe den Path ausgeben lassen, und es wird korrekt angezeigt (/home/grad/inschulz/test001.bmp bzw. /home/grad/inschulz/test001.tga). Auf jeden Fall habe ich mit Jimi angefangen, da Java standardmaessig nur JPEG und (komprimiertes?) GIF unterstuetzt, mein Prof. hier aber unbedingt bmp und/oder Targa lesen will.

Auf der Suche nach Tutorials bin ich immer nur auf Beispiele gestossen, die entweder JPEGs schreiben oder nicht-komprimiertes GIF lesen wollten. (Warum eigentlich nie Bitmaps?)

Dann habe ich mal die Jimi-API etwas durchforstet und bin auf Decoder-Pakete gestossen, die es fuer alle moeglichen Formate gibt, nur eben nicht fuer JPEG und GIF. Deshalb die Frage, ob ich das irgendwie dekodieren muss. Aber ich habe keine Ahnung, wie ich das mache.

Kennt jemand ein vernuenftiges Tutorial fuer Jimi?

Mit der Fehler-Message meine ich folgende Zeilen aus meiner loadFromFile(...) in meiner GUI:
catch(Exception f)
{
showError("Cannot open image.") ;
}

Das soll angezeigt werden, wenn das Laden nicht funktioniert. Ansonsten habe ich keine Fehlermeldungen. Waere (fast) schoen, wenn ich welche haette, dann haette ich eventuell eine Ursache fuer das Misslingen ...

Auf jeden Fall danke ich Dir fuer die Hilfe!
Bis denne!
Schnoof

Antwort 8 von semi

Ich habe noch ein einfaches Beispiel mit JDesktopPane gemacht. Es zeigt alle Grafikdateien aus dem aktuellen Verzeichnis in jeweils einem JInternalFrame an.
Schau es Dir an.


import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

import com.sun.jimi.core.*;
import com.sun.jimi.core.util.*;

public class ImageDesktop extends JDesktopPane {

  public ImageDesktop() {
    super();
  }

  public void addInternalFrameFor(String filename) {
    Image image = null;
    try {
      image = Jimi.getImage(filename);
      GraphicsUtils.waitForImage(image);
    }
    catch(Exception e) {
      JOptionPane.showMessageDialog(
        this,
        "Fehler beim Laden der Grafikdatei !" + filename,
        "Fehler!",
        JOptionPane.ERROR_MESSAGE
      );
      return;
    }

    JInternalFrame frame =
      new JInternalFrame(filename, true, true, true, true);
    JScrollPane s = new JScrollPane();
    s.getViewport().setView(new ImagePanel(image));
    frame.setContentPane(s);
    frame.pack();
    add(frame);
    frame.setVisible(true);
    try {
      frame.setSelected(true);
    }
    catch(java.beans.PropertyVetoException e) {}
  }

  public static void main(String argv[]) {

    try {
      JFrame frame = new JFrame("ImageViewer");
      Dimension screenSize =
        Toolkit.getDefaultToolkit().getScreenSize();
      frame.setBounds(
        (screenSize.width-1024)/2,
        (screenSize.height-768)/2,
        1024, 768
      );

      ImageDesktop desktop = new ImageDesktop();
      frame.setBackground(desktop.getBackground());
      frame.setContentPane(desktop);
      frame.addWindowListener(
        new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
            System.exit(0);
          }
        }
      );
      frame.setVisible(true);

      // Alle Dateien des aktuellen Verzeichnisses holen
      String images[] = (new File(".")).list(
        new FilenameFilter() {
          public boolean accept(File dir, String name) {
            return name.endsWith(".bmp")
                || name.endsWith(".tga"); // usw. mit gif, jpg
          }
        }
      );
      for(int i=0; i<images.length; i++)
        desktop.addInternalFrameFor(images);

    }
    catch(Exception e) {
      e.printStackTrace();
      System.exit(0);
    }

  }

}

class ImagePanel extends JPanel {

  private Image image = null;

  public ImagePanel(Image image) {
    this.image = image;
  }

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

  public Dimension getPreferredSize() {
    return (image==null)?new Dimension(0, 0):
            new Dimension(image.getWidth(null),
            image.getHeight(null));
  }

}

Compilieren:
javac -classpath .;JimiProClasses.zip; ImageDesktop.java
Starten:
java -classpath .;JimiProClasses.zip; ImageDesktop

Gruß,
Michael

Antwort 9 von Schnoof

Als was arbeitest Du denn. Du scheinst ja wirklich ziemlich kompetent zu sein. Und offensichtlich hast viel Zeit ... mehr oder weniger.

Mal schauen, ob es funzt. Ich meld mich dann noch mal.

Danke!
Inga

Antwort 10 von Schnoof

Ich hab da mal 'ne Frage:

Wenn Du java.beans.irgendwas einbindest, musst Du das dann nicht auch importieren? Wozu java.io.*?

Danke!
Schnoof

Antwort 11 von Schnoof

Danke, danke, danke, danke, danke!
Ich konnte es in meinen Kram recht easy einbinden, und es laeuft!

Danke!
Schnoof

Antwort 12 von semi

Das mit dem java.beans kommt nur einmal bei java.beans.PropertyVetoException vor, und muss bei der Methode JInternalFrame.setSelected(boolean flag); abgefangen werden.
Wenn Du bei einer Klasse das Package direkt angibst, dann musst Du diese Klasse nicht estra importieren.
java.io wird für File gebraucht (siehe main)

Viel Erfolg noch!
Michael


Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: