2016-09-11 16 views
0

は私がグレースケール画像からホワイトカラーピクセルの値を取得し、別の色と交換しようとしていますが、私は自分のコードを実行すると、全体グレースケール画像は別の色に転送されます。誰でもコードの誤りがどこにあるのか、どうすれば希望の結果を得ることができるのか教えてください。 これは、前のコード...グレースケール画像から白色のピクセル値を取得し、別の色に置き換えるにはどうすればよいですか?

public class gray { 
    public static void main (String args[])throws IOException{ 
     int width; 
     int height; 

     BufferedImage myImage = null; 

     File f = new File("E:\\eclipse\\workspace\\Graphs\\src\\ColorToGray\\1.png"); 
     myImage = ImageIO.read(f); 

     width = myImage.getWidth(); 
     height = myImage.getHeight(); 

     BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB); 

     int pixels[]; 


     pixels = new int[width * height]; 
     myImage.getRGB(0, 0, width, height, pixels, 0, width); 

     for (int i = 0; i < pixels.length; i++) { 
      if (pixels[i] == 0xFFFFFF) { 
       pixels[i] = 0x000000FF; 
      } 
     } 
     File f2 = new File("E:\\eclipse\\workspace\\Graphs\\src\\ColorToGray\\out 1.png"); 
     image.setRGB(0, 0, width, height, pixels, 0, width); 
     ImageIO.write(image, "jpg", f2); 

    } 
} 

画像です:私はそれに見て、問題の束を見つけ

Image After Output

答えて

0

:後

Image Before Output

画像。

まず、保存するファイル名を指定するときは、 ".png"拡張子を指定しますが、ImageIO.write()関数を呼び出すときは、ファイルタイプ "jpg"を指定します。それはうまく動かない傾向があります。結果のファイルを開こうとすると、ほとんどのプログラムから "これは有効な.PNGファイルではありません"というエラーが表示されます。 Windowsエクスプローラはスマートになり、.PNGを.JPGとして再解釈しますが、これはあなたの間違いを発見する機会からあなたを守りました。

これは、奇妙な赤みの問題を処理します。

ImageIO.write()に「png」を指定しても、正しい画像が得られません。 1つは元々のように見える画像で、明るい白は元々あった場所の青のパッチがほんの少しありますが、元の画像の全体的に明るいバージョンが得られます。

オリジナルの画像を見て、実際に何が間違っているかを調べるのに時間が足りませんが、実際にはアルファマスクを使った明るい画像で、明るく見えない明るい画像と思われます画像が保存される方法に間違っていて、アルファ情報を取り去って明白に追加された明るさです。

だから私はあなたのコードを試してみましたが、あなたのコードは何もしていないようです。 myImage.getRGB();から得られるint値のARGB形式は、「A」に対して255を返します。つまり、0x00FFFFFFではなく0xFFFFFFFFを確認する必要があります。

もちろん、値を置き換えるときは、完全なアルファ値を指定して0xFF0000FFに置き換える必要があります。ピクセルを0x000000FFに置き換えると、目に見える効果はありません。なぜなら、高い青の値にかかわらず、アルファがゼロであるため、ピクセルが透明にレンダリングされるからです。

関連する問題