Webstart Laden von Tiff-Bildern als BufferedImage und TFW aus einem JAR

evilion

Mitglied
Hallo Leute

Ich hab folgendes Problem

Code:
java.lang.IllegalArgumentException: Width (2147483647) and height (-2147483648) cannot be <= 0
	at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
	at java.awt.image.BufferedImage.<init>(Unknown Source)
	at map.Land.cropImage(Land.java:635)
	at map.Land.<init>(Land.java:286)
	at map.Map.createSceneGraph(Map.java:174)
	at map.Map.init(Map.java:142)
	at map.Map.main(Map.java:89)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.sun.javaws.Launcher.executeApplication(Unknown Source)
	at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
	at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
	at com.sun.javaws.Launcher.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Mit anderen Worten, wie ich es glaube, kann er zwar das Bild laden aber nicht weiter verwenden. Oder er hat beim Laden Probleme.

Zum laden des Bildes verwende ich:
Java:
      //Lade das Bild von dem Kartenausschnitt
      BufferedImage bufferedImage = null;
      try {
         //Lokal
         //File file = new File("125.tif");
         //URL url = this.getClass().getResource("/images/ortho2004_10.tif");
         //File file = new File("ortho2004_10.tif");
         //File file = new File(ClassLoader.getSystemResource("/image/ortho2004_10.tif"));

         //Java WebStart
         //File file = new File("pics\\land\\125.tif");
         //File file = new File("pics\\land\\ortho2004_10.tif");
         //bufferedImage = ImageIO.read(file);
         bufferedImage = ImageIO.read(getClass().getResourceAsStream(
               "/images/ortho2004_10.tif"));
         System.out.println("Hab das TIF geladen, Boss");
      }
      catch (Exception e) {
         System.out.println("Sorry boss I cant get any image loaded.");
      }

Wenn ich das Bild geladen hab, will ich es zuschneiden, das mache ich mit diesem Befehl
Java:
//Erstell ein ImageComponent2D aus dem geschnittenem Bild
      ImageComponent2D textImage = new ImageComponent2D(
            ImageComponent2D.FORMAT_RGB,
            cropImage(bufferedImage,
                      x, y, width, height));

Der Fehler taucht hier auf

Java:
public static BufferedImage cropImage(BufferedImage original, int left,
                                         int top, int width, int height) {
      //Das ausgeschnittene Bild
      BufferedImage resizedImage = new BufferedImage(width, height, getType(
            original.getColorModel())); //***<-FEHLER bei original.getColorModel()***
      //Instanziere graphics2D Objekt um ins resizedImage hineinzuzeichnen
      Graphics2D graphics2D = resizedImage.createGraphics();
      //Setze Eigenschaften für das Rendering
      graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                  RenderingHints.VALUE_ANTIALIAS_ON);

      //Wenn die Breite grösser als die Originalbreite ist, wird die Textur Bicubic
      if (width > original.getWidth()) {
         graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                                     RenderingHints.VALUE_INTERPOLATION_BICUBIC);
      }
      //Sonst Bilinear
      else {
         graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                                     RenderingHints.VALUE_INTERPOLATION_BILINEAR);
      }
      graphics2D.setRenderingHint(RenderingHints.KEY_RENDERING,
                                  RenderingHints.VALUE_RENDER_DEFAULT);
      //Zeichne das Bild aus dem Original mit der vorgegebenen Breite und Höhe
      graphics2D.drawImage(original, 0, 0, width, height, left, top,
                           width + left, height + top, null);


      System.out.println("Bild wurde geschnitten");
      /*
      File asdf = new File("C:\\temp\\asdf");
      try {
      ImageIO.write(resizedImage, "JPG", asdf);
      }
      catch (IOException ex) {
      Logger.getLogger(Land.class.getName()).log(Level.SEVERE, null, ex);
      }*/
      return resizedImage;
   }// end of cropImage()

Das passiert mir aber nur bei Webstart.
Bei Netbeans läuft alles wunderbar.
Bei cmd (java -jar map3D.jar) stürzt das Program nach dem Ausführen ab. Ohne Fehlermeldung und einer erfolgreichen Meldung "ok".

Ach und bevor ich es vergesse...
Ich lade ein Tiff Bild. Um das zu ermöglichen benutze ich JAI_imageio Bibliothek. Diese ist im .jnlp eingebunden und sollte geladen werden.
Mein .jnlp sieht dabei so aus:

[XML]<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jnlp codebase="file:/C:/NetBeansProjects/Map_3D/dist/" href="launch.jnlp" spec="1.0+">
<information>
<title>Mapdarstellung ALPHA</title>
<vendor>Evilion</vendor>
<homepage href=""/>
<description>Map</description>
<description kind="short">Mapdarstellung ALPHA</description>


<offline-allowed/>
</information>

<security>
<all-permissions/>
</security>

<resources>
<j2se java-vm-args="-Djava.security.policy=applet.policy" initial-heap-size="250M" max-heap-size="500M" version="1.5+"/>
<property name="Xms" value="250M"/>
<property name="Xmx" value="500M"/>
<property name="j3d.rend" value="d3d"/>
<jar eager="true" href="Map_3D.jar" main="true"/>


<jar href="lib/postgresql-8.4-701.jdbc4.jar"/>
<jar href="lib/j3dcore-d3d_dll.jar"/>
<jar href="lib/j3dcore-ogl-chk_dll.jar"/>
<jar href="lib/j3dcore-ogl_dll.jar"/>
<jar href="lib/j3dcore.jar"/>
<jar href="lib/j3dutils.jar"/>
<jar href="lib/vecmath.jar"/>
<jar href="lib/clib_jiio.dll.jar"/>
<jar href="lib/clib_jiio_sse2.dll.jar"/>
<jar href="lib/clib_jiio_util.dll.jar"/>
<jar href="lib/clibwrapper_jiio.jar"/>
<jar href="lib/jai_imageio.jar"/>
</resources>
<application-desc main-class="map.Map">

</application-desc>
</jnlp>
[/XML]

Kann mir jamand helfen?
 
Zuletzt bearbeitet:
Hallo,

es liegt lt. Fehlermeldung nicht am original.getColorModel(), sondern an dem width und dem height.
2147483647 und -2147483648 sind nämlich die maximalsten bzw. minimalsten Werte, die ein Integer annehmen kann.

Wird das Bild auch wirklich geladen (mach mal eine Prüfung mit bufferedImage == null).

Überprüfe die Werte (bufferedImage, x, y, width und height), bevor du sie an die Methode cropImage() übergibst. Es könnte sein, das da irgendwo der Fehler liegt.

MfG
hansmueller
 
x: 2147483647 y: 2147483647 width: 2147483647 height: -2147483648

...
*kopf -> tisch*
verdammt... das mir das nicht frueher aufgefallen ist...

dann...

Ich lese ein .tfw File ein, der 6 Werte enthält. Diese dienen um das dazugehörige Bild zu georeferenzieren.
Ich lese es so ein:
Java:
int x = 0, y = 0, width = 0, height = 0;

      /* 0: X-Scale - wie viel meter pro pixel
       * 1: Rotation y
       * 2: Roration x
       * 3: Y-Scale - wie viel meter pro pixel (negativ)
       * 4: X-Reference (Top Left Corner Pixel)
       * 5: Y-Reference (Top Left Corner Pixel)
       * */
      double[] tfw = new double[6];

      //Lade den TFW Angaben Datei
      //Und schreibe es in den vorher definierten Array
      try {
         int i = 0;
         // Open the file that is the first
         // command line paramete
         //Lokal
         //FileInputStream fstream = new FileInputStream("125.tfw");

         //FileInputStream fstream = new FileInputStream(ClassLoader.getResourceAsStream("/images/ortho2004_10.tfw"));
         InputStream fstream = java.lang.Object.class.getResourceAsStream("/images/ortho2004_10.tfw");
         //Java WebStart
         //FileInputStream fstream = new FileInputStream("pics\\land\\125.tfw");
         //FileInputStream fstream = new FileInputStream("ortho2004_10.tfw");
         // Get the object of DataInputStream
         DataInputStream in = new DataInputStream(fstream);
         BufferedReader br = new BufferedReader(new InputStreamReader(in));

         /*final BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getClassLoader().getResourceAsStream(
               "/images/ortho2004_10.tfw")));*/



         String strLine;
         //Read File Line By Line
         while ((strLine = br.readLine()) != null) {
            tfw[i] = Double.valueOf(strLine).doubleValue();
            i++;

         //System.out.println(strLine);
         }
         //Close the input stream
         in.close();
         //br.close();
         System.out.println("Hab das TFW geladen, Boss");
      }
      catch (Exception e) {//Catch exception if any
         System.err.println("Error: " + e.getMessage());
      }

Ich hab da sehr viel experementiert und bis jetzt hat es wunderbar im Netbeans geklappt.

Wenn ich die Zeile final BufferedReader br... verwende, dann krieg ich die gleiche Fehlermeldung wie mit Webstart.

Ich bräuchte hier bei immernoch hilfe, wenn jemand eine elegante Lösung hat, wie man im Webstart ein .tfw file einliest, dann bitte postet diese.
Wenn ich vorher ne funktionierende Lösung habe, dann poste ich das hier rein.
 
Zuletzt bearbeitet:
Funktionierende Lösung:
Um TFW einzulesen benutzte ich
Java:
int x = 0, y = 0, width = 0, height = 0;

      /* 0: X-Scale - wie viel meter pro pixel
       * 1: Rotation y
       * 2: Roration x
       * 3: Y-Scale - wie viel meter pro pixel (negativ)
       * 4: X-Reference (Top Left Corner Pixel)
       * 5: Y-Reference (Top Left Corner Pixel)
       * */
      double[] tfw = new double[6];

      //Lade den TFW Angaben Datei
      //Und schreibe es in den vorher definierten Array
      try {
         int i = 0;
         // Get the object of DataInputStream
         //funktionierende lösung in javawebstart und sonst

         InputStream is = getClass().getResourceAsStream("/images/ortho2004_10.tfw");
         InputStreamReader isr = new InputStreamReader(is);
         BufferedReader br = new BufferedReader(isr);

         String strLine;
         //Read File Line By Line
         while ((strLine = br.readLine()) != null) {
            tfw[i] = Double.valueOf(strLine).doubleValue();
            i++;
         }
         //Close the input stream
         br.close();
         System.out.println("Hab das TFW geladen, Boss");
      }
      catch (Exception e) {//Catch exception if any
         System.err.println("Error: " + e.getMessage());
      }
 

Neue Themen


Zurück
Oben