# JPG Kann nicht geladen werden!



## dayaftereh (7. Feb 2010)

Hey,

Ich versuche gerade ein JPG Bild, welches ich mit eine nikon Kamera gemacht habe über ImageIO.read() zu laden! ich bekomme aber folgende Exception:

```
Exception in thread "ImageConverter-1" java.awt.color.CMMException: Invalid image format
	at sun.awt.color.CMM.checkStatus(Unknown Source)
	at sun.awt.color.ICC_Transform.<init>(Unknown Source)
	at java.awt.image.ColorConvertOp.filter(Unknown Source)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(Unknown Source)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source)
	at javax.imageio.ImageIO.read(Unknown Source)
	at javax.imageio.ImageIO.read(Unknown Source)
	at de.ll.imagescaler.thread.ConvertImageThread.loadImage(ConvertImageThread.java:193)
	at de.ll.imagescaler.thread.ConvertImageThread.doImage(ConvertImageThread.java:86)
	at de.ll.imagescaler.thread.ConvertImageThread.run(ConvertImageThread.java:72)
```
Die Endung der Datei ist JPG und der TYP auch! Ich kann ein ImageIcon daraus erzugen, dan bekomme ich auch das Richtige Bild, aber ich will es als BufferedImage.Ich glaube es geht hier um ein lossless JPG!
Hat Jemand eine Idee?

Danke Schonmal


----------



## AlexSpritze (8. Feb 2010)

Wenn deine JPEG-Files ProfilInformation haben, versuche die mal aus den Bildern testweise zu entfernen.
Dann sollte keine Exception kommen.


----------



## dayaftereh (8. Feb 2010)

Ja! aber ich will das Bild Laden egal ob es ProfilInformation hat! gibt s da keine Möglichkeit! weil das Programm soll egal Welche Bilder Verkleinern! und hauptsächlich sind es Bilder von hochauflösenden Kameras


----------



## Marco13 (8. Feb 2010)

Also ImageIcon macht intern ein

```
image = Toolkit.getDefaultToolkit().getImage(filename);
```

Wenn das geht, kannst du das erhaltene Image ja ggf. in ein BufferedImage reinmalen (und wenn es nur darum geht: Es dabei auch gleich verkleinern...)


----------



## dayaftereh (8. Feb 2010)

Hey ich Lade jetzt das Image über:

```
Toolkit.getDefaultToolkit().getImage(f.toURL());
```
Und Scale das Image so:

```
public BufferedImage scale(Image image) {
		int width = 1024;
		int height = 765;

		Image scaledImage = image.getScaledInstance(width, height, Image.SCALE_SMOOTH);
		image = null;

		BufferedImage outImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		Graphics2D g2 = (Graphics2D) outImg.getGraphics();
		//g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		g2.drawImage(scaledImage, 0, 0, null);
		g2.dispose();
		g2 = null;

		return outImg;
	}
```
Ich bekomme Einfach nur Schwarz! Auch wenn ich eine ImageIcon erzugen und dan mir das Image Holle! Wo ran kann das Liegen! Das Geladene Image ist nich null!


----------



## Marco13 (8. Feb 2010)

Vermutlich musst du mit einem MediaTracker warten, bis das Bild vollständig geladen ist.

Nebenbei, zum Skalieren ist hier noch ein Klassiker: The Perils of Image.getScaledInstance() | Java.net


----------



## dayaftereh (8. Feb 2010)

Hey,

Es klappt drozdem nicht! Das bild ist immer noch schwarz! ich warte auf das Hinzugefüght Bild, es gibt keinen Fehler!
*Edit:*
Also ich Versuche Bilder aller Art vom Typ JPG / JPEG zu laden un zu verkleiner! Aber Ich habe jetzt eine Bild das mit eine Nikon kamera gemacht wurde und jetzt Sagt mir ImageIO.read() Invalide Image Format! wie kann ich jetzt Solche Imges Verkleiner?


----------



## Marco13 (8. Feb 2010)

Dass er das nicht laden kann, ist schon seltsam genug... und der Rest ist richtig schräg... Kannst du so ein Bild testweise irgendwo hochladen, oder spricht da Datenschutzrechtlich was dagegene?


----------



## dayaftereh (8. Feb 2010)

Hab dir den Link als PM geschickt!


----------



## Marco13 (8. Feb 2010)

Sehr seltsam. Dass ImageIO das nicht laden kann sollte man eigentlich in die Bugdatabase stellen. Das sollte nicht sein. Wenn man nach der Fehlermeldung sucht, findet man ein bißchen was, aber nur ziemlich... unspezifisch. Leider kann man sich ja auch den Code von CMM nicht ohne weiteres ansehen - sonst könnte man mal versuchen, nachzuvollziehen, woran das liegt....

OK, dass man da das Toolkit.getDefaultToolkit() verwenden muss ist eine Sache. Aber dass das Bild das man dabei zurückbekommt, offenbar auch nicht ganz ... in Ordnung ist, ist schon sehr außergewöhnlich: Offenbar kann man auf diesem Bild nicht getScaledInstance aufrufen (bzw. bekommt eben das schwarze Bild zurück). Irgendwas ist da ziemlich "kaputt". (In gewissen Grenzen könnte das auch am Bild liegen, wenn da irgendwelche "falschen" Metainfos oder so drin stehen - aber... ingesamt ist das ziemlich ???:L verwirrend...)

Eine Möglichkeit ist, das skalieren so (wie auch in dem oben geposteten Link angedeutet) zu machen: Man malt das Bild (was ja zum Glück zumindest geht :autsch: ) verkleinert in das BufferedImage, das man dann abspeichern oder sonstwie weiterverwenden kann. 



```
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;

public class ImageResizeTest
{
    public static void main(String args[]) throws Exception
    {
        //BufferedImage image = ImageIO.read(new File("H-M_02.JPG"));

        Image image = Toolkit.getDefaultToolkit().createImage("H-M_02.JPG");
        MediaTracker tracker = new MediaTracker(new JLabel());
        tracker.addImage(image, 0);
        try
        {
            tracker.waitForAll();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        int width = 1024;
        int height = 765;

        BufferedImage outImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = (Graphics2D) outImg.getGraphics();
        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2.drawImage(image, 0, 0, width, height, null);
        g2.dispose();
        g2 = null;

        // ImageIO.write(outImg, "jpg", new File("H-M_02_OUT.JPG")); // verkleinertes Bild rausschreiben - funzt...

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new JLabel(new ImageIcon(outImg)));
        f.pack();
        f.setVisible(true);

    }

}
```


----------

