# JAI TIFF



## Deficiency (13. Mrz 2007)

Hallo Leute!

Ich hab ein Problem. Und zwar hab ich ein TIFF Bild eingescannt und will es nun von Platte lesen um es in ein Byte[] zu verwandeln!

OK Das mit dem Byte[] hab ich, wenn ich auf ein Buffered Image komm!

Jedoch werde ich aus den ganzen Tutorials über JAI nicht schlau!
Hat jemand einen Codeausschnitt, der zeigt, wie ich ein JPEG oder TIFF lade und dann zu einem BufferedImage komm?

Vielen Dank

Flo


----------



## thE_29 (13. Mrz 2007)

Schon mal was von Suchfunktion gehört? (einfach mal nach dem suchen was man will.. Ist gar nicht so schwer..)

5ter Treffer sogar mit BufferedImage im Titel

http://www.java-forum.org/de/viewtopic.php?t=38531&start=0


----------



## Deficiency (14. Mrz 2007)

Jo klar hab ich schonmal was von Suchfunktion gehört aber:
ich habe folgenden Code:


```
SeekableStream fis = new FileSeekableStream (new File("C:\\Programme\\Scan\\"+ name + i + ".tiff"));
ImageDecoder dec=ImageCodec.createImageDecoder("TIFF", fis, null);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(dec.decodeAsRenderedImage(0),"TIFF",stream);
ByteArrayInputStream in = new ByteArrayInputStream(stream.toByteArray());
BufferedImage bimg = ImageIO.read(in);
```

Am Schluss steht im bimg "null" drin.....


Obwohl alles klappen müsste, die File existiert auf der Platte und ist auch im Stream

thx

Flo


----------



## thE_29 (14. Mrz 2007)

Weil es beim write kein TIFF  gibt 

Dort musst du "png" hin!


----------



## Deficiency (14. Mrz 2007)

und wie kann ich dann ein Tiff schreiben????


----------



## thE_29 (14. Mrz 2007)

Nicht mit ImageIO sondern mit JAI Dingern halt!


----------



## KM (30. Mrz 2007)

Hallo,

bei mir klappt das mit nachfolgendem Code.  Über Parameter lasse ich auch die Auflösung bzw. die Skalierung ändern. Ich habe aber das Problem, dass das als Servlet läuft und ich nur auf lokale Grafiken zugreifen kann. Wenn ich auf eine Grafik zugreife, die auf einem anderen Server liegt, erhalte ich "Zugriff verweigert". Das scheint beim FileSeekableStream zu passieren. Ich erhalte folgenden Fehler:

Fehler: \\server\freigabe\69416301_001001.tiff (Zugriff verweigert)

Und das, obwohl auf diese Freigabe und Datei jeder Vollzugriff hat. Kann mir das jemand erklären ?

Und hier der Code.

Gruß,
KM



```
public static void Konvertierung(String inputDir, String outputDir, String tiff_file, float x_scale, float y_scale, int grad, long x_res, long y_res) {

        try {

            // Übergabe-Parameter einlesen und Variablen definieren
            String inputPfad = inputDir + tiff_file;
            String outputPfad = outputDir + tiff_file;
            PlanarImage image_in;
            PlanarImage image_out;

            System.out.println(inputPfad);
            System.out.println(outputPfad);

            // Grafik einlesen
            File f_input = new File(inputPfad);
            FileSeekableStream fss = new FileSeekableStream(inputPfad);

            if ( f_input.exists() && f_input.canRead() ) {
               image_in = JAI.create("stream", fss);
               OutputStream out = new FileOutputStream(outputPfad);

               // Grafik skalieren
               ParameterBlock pb1 = new ParameterBlock();
               pb1.addSource(image_in);
               pb1.add(x_scale);      // x-scale factor
               pb1.add(y_scale);      // y-scale factor
               pb1.add(0.0F);         // x-translate
               pb1.add(0.0F);         // y-translate
               pb1.add(new InterpolationNearest());
               image_out = JAI.create("scale", pb1);

               // Grafik drehen
               ParameterBlock pb2 = new ParameterBlock();
               float y = (float)image_in.getHeight()/2;
               float x = (float)image_in.getWidth()/2;
               float angle = (float)Math.toRadians(grad);
               pb2.addSource(image_out);
               pb2.add(x);
               pb2.add(y);
               pb2.add(angle);
               pb2.add(new InterpolationNearest());
               image_out = JAI.create("rotate", pb2);

               // Druckauflösung der Grafik festlegen und Kompression bestimmen
               TIFFEncodeParam tep = new TIFFEncodeParam();
               TIFFField[] extras = new TIFFField[3];
               extras[0] = new TIFFField(282,TIFFField.TIFF_RATIONAL, 1, (Object)new long[][] {{x_res,(long)1},{(long)0 ,(long)0}});
               extras[1] = new TIFFField(283,TIFFField.TIFF_RATIONAL, 1, (Object)new long[][] {{y_res,(long)1},{(long)0 ,(long)0}});
               extras[2] = new TIFFField(296, TIFFField.TIFF_SHORT, 1, (Object) new char[] {2});
               tep.setExtraFields(extras);
               tep.setCompression(TIFFEncodeParam.COMPRESSION_GROUP3_2D);
               JAI.create("encode",image_out, out, "tiff", tep);

               // sämtliche Objekte schließen und Aufräumarbeiten ausführen
               out.close();
               fss.close();
               image_in.dispose();
               image_out.dispose();
               System.gc();

               // Input-Datei löschen
               // f_input.delete();
               }
            else {
               System.out.println("Quelldatei " + tiff_file + " existiert nicht oder kann nicht gelesen werden !");
               }
            }

        catch (Exception e) {
              System.err.println("Fehler: " + e.getMessage());
              }
    }
```


----------

