3

画像の読み取りに問題があります。私が次のことをすると

URL url = new URL("http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg");
ImageInputStream stream = ImageIO.createImageInputStream(url.openStream());
ImageReader reader = ImageIO.getImageReaders(stream).next();
reader.setInput(stream, true, true);
BufferedImage image = reader.read(0);

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageWriter writer = ImageIO.getImageWritersByFormatName("JPEG").next();
ImageOutputStream ios = ImageIO.createImageOutputStream(bos);
writer.setOutput(ios);
IIOImage ioImage = new IIOImage(image, null, null);
writer.write(ioImage);
ios.close();
FileOutputStream fos = new FileOutputStream("badimage.jpeg");
fos.write(bos.toByteArray());
fos.close();

画像は赤い色合いで書かれています。この画像を正しく読み取るために設定する必要のあるオプションはありますか?

4

6 に答える 6

5

この問題ImageIO.readは、一部の JPG 画像を正しく読み取れないことに関連している可能性があります。これは、まだ部分的に解決されていない可能性のある同様のバグ(バグ ID: 4881314) です。

Toolkit.createImage別の方法として、指定された画像を正しく処理しているように見えるものを使用してみることができます。例えば:

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

class TestImage {
    public static void main(String args[]) {
        try {
            URL imageUrl = new URL(
                "http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg");
            BufferedImage ioImage = ImageIO.read(imageUrl);
            Image toolkitImage = Toolkit.getDefaultToolkit().createImage(
                    imageUrl);

            JPanel panel = new JPanel();
            panel.add(new JLabel(new ImageIcon(ioImage)));
            panel.add(new JLabel(new ImageIcon(toolkitImage)));

            JOptionPane.showMessageDialog(null, panel, "ImageIO vs Toolkit",
                    JOptionPane.INFORMATION_MESSAGE);

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage(), "Failure",
                    JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        }
    }
}

結果は次のとおりです。

ここに画像の説明を入力

于 2012-10-19T03:45:28.457 に答える
1

ごめん。なぜ赤い色合いがあるのか​​ についての答えはありません。

これが、ソフトウェアで画像を読み取る方法です。この例では、スカラー ライブラリを使用して画像のサイズを変更しています。

URL url = new URL("http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg");
BufferedImage source = javax.imageio.ImageIO.read(url);
BufferedImage manipulated = ...
FileOutputStream fos = new FileOutputStream("badimage.jpeg");
javax.imageio.ImageIO.write(manipulated , "png", fos);
于 2012-10-18T21:20:27.860 に答える
0
BufferedImage bi =
   ImageIO.read(
      "http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg" );
ImageIO.write( bi, 'JPEG', new File( "badimage.jpeg" );
于 2012-10-18T21:15:02.057 に答える
0
ImageIcon mySourceImage = new ImageIcon(sourceImageFile.getAbsolutePath());
BufferedImage sourceImage = new BufferedImage(mySourceImage.getIconWidth(),  mySourceImage.getIconHeight(), BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g2d2 = (Graphics2D) sourceImage.getGraphics();
mySourceImage.paintIcon(null, g2d2, 0, 0);
g2d2.dispose();

上記のコードは、(おそらく) バグを含む Image.read を使用していません。赤い画像は生成されません。しかし、BufferedImage の 3 番目のパラメーターの色空間についてはわかりません。

于 2015-04-01T11:06:48.680 に答える
0

他の回答で述べたように、これは ImageIO と Oracle JRE にバンドルされている標準 JPEG プラグインの既知のバグです。

ただし、JPEG プラグインをTwelveMonkeys ImageIO JPEG pluginに置き換えることで、OP の元のコードと同様に ImageIO を引き続き使用することができます。JAR とその依存関係をランタイム クラスパスに追加するだけです。コードの変更は必要ありません (OP のテスト ファイルでテストしました)。

このプラグインは、標準の JPEG プラグインの多くの問題を回避または修正するために特別に作成されています。CMYK JPEG、破損した ICC プロファイル、Exif データなどをサポートしています。このプラグインは私が開発したもので、オープン ソース BSD ライセンスの下で自由に配布できます。

于 2016-05-19T09:26:55.283 に答える