2011-12-20 8 views
4

画像があり、それをgrayscale.jpgと呼びます。今度はその画像をThe Gimpで開き、カラーモードをRGBに変更してcolor.jpgとして保存します。どの画像ビューアでもgrayscale.jpgとcolor.jpgを見ると、まったく同じように見えます。私は正しい値を返しますjavax.imageio.ImageIOjavax.imageio.ImageIOグレースケール画像上の不適切なRGB値を読み取る

import javax.imageio.ImageIO; 

input = ImageIO.read(new File("grayscale.jpg")); 
System.out.format("Grayscale value: %x\n", input.getRGB(200, 200)); 

input = ImageIO.read(new File("color.jpg")); 
System.out.format("Color value: %x\n", input.getRGB(200, 200)); 

カラー画像で画像を開いた場合でも、0xff6c6c6cを言います。グレースケール画像は、0xffaeaeaeのように違った、より軽く、間違った値を返します。言い換えれば

Grayscale value: 0xffaeaeae // Incorrect (Lighter) 
Color value:  0xff6c6c6c // Correct 

、javax.imageio.ImageIOは、グレースケール画像は、彼らが実際よりもはるかに軽いです考えています。グレースケールイメージを正確に読み取るにはどうしたらいいですか?

編集

ここでより多くのコンテキストです。ユーザーがグレースケールの画像をアップロードします。 Javaはサーバー上で動作し、かなり複雑な画像処理を行います。ですから、理想的な解決策は、コマンドラインツールを使って何かを共にするのではなく、Javaコードを修正することです。

+0

より掘削した後、これは http://stackoverflow.com/questions/6474753/my-batch-jpg-resizerの複製であります- –

答えて

-1

JPEGを使用しているため、テストには関係ありません。これは損失です。圧縮に応じて、他の色の値を持つことがあります。だから、無損失であるPNGで同じことを試してみてください。

この画像を使用して、javax.imageioの正しさをテストできます。これをGimpでグレースケールに変換し、PNG形式で保存してください。その後、同じ方法で両方(この1つと変換されたもの)を読み込みます。そしてforループでy軸のすべての色を比較します。

enter image description here

サンプルコード:

BufferedImage inputGrayscale = ImageIO.read(new File("grayscale.png"));  
BufferedImage inputColor = ImageIO.read(new File("color.png")); 

for (int i = 0; i < 256; ++i) 
{ 
    System.out.printf(i + "Grayscale value: %x\n", inputGrayscale.getRGB(10, i)); 
    System.out.printf(i + "Color value: %x\n", inputColor.getRGB(10, i)); 
    System.out.println(); 
} 
+0

それは単なる圧縮物ではありません。すべてのピクセルを読み込んでファイルに書き出すと、イメージをピクセル単位でコピーすると、カラーイメージのコピーが正しく表示され、グレースケールイメージのコピーは入力ファイルよりもはるかに軽くなります。 –

+0

また、より多くの文脈を追加するmy editを参照してください。これらのイメージはユーザーからのもので、私はそれらが.png対.jpgについて心配する必要はありません。カメラの出力が何であれ、直接アップロードできるはずです。 –

関連する問題