-1

M が画像処理プログラムに取り組んでいるときに、グレースケール画像を表示する際に問題が発生しました。私がしたことは、getRGB を使用してピクセル値を抽出し、これらのピクセル値を変更しようとしたことです。しかし、これらのピクセル値を変更した後も、以前にバッファリングされたのと同じ画像が得られます。コードの私の部分を以下に示します:-

  int [] rgbArray=new int[width*height];
  BufferedImage buffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  buffer = ImageIO.read(new File(file));


  //Before changing the pixel values
  buffer.getRGB(0, 0, width, height, rgbArray , 0,width );
  int a = (0xff000000 & rgbArray[0]) >>> 24;
  int r = (0x00ff0000 & rgbArray[0]) >> 16;
  int g = (0x0000ff00 & rgbArray[0]) >> 8;
  int b = (0x000000ff & rgbArray[0]);
  System.out.println("a " + a + " r " + r + " g " + g + " b " + b);
  System.out.println("rgbArray["+0+"] = "+ rgbArray[0]);
  for(int i = 0 ; i<width*height; i++)
   {
     rgbArray[0]=0x808080;  //Changing pixel values to grey
   }
  buffer.setRGB(0, 0, width, height, rgbArray , 0,width);


  //After changing the pixel values
  buffer.getRGB(0, 0, width, height, rgbArray , 0,width );
  a = (0xff000000 & rgbArray[0]) >>> 24;
  r = (0x00ff0000 & rgbArray[0]) >> 16;
  g = (0x0000ff00 & rgbArray[0]) >> 8;
  b = (0x000000ff & rgbArray[0]);
  System.out.println("a " + a + " r " + r + " g " + g + " b " + b);
  System.out.println("rgbArray["+0+"] = "+ rgbArray[0]);

ピクセル値の出力は、元のピクセルと新しいピクセルの両方で正しいことがわかりますが、新しい画像を表示できません。変更された画像ではなく、元の画像が表示されています。

4

1 に答える 1

1
rgbArray[0]=0x808080;  //Changing pixel values to grey

そこでは、最初のピクセルをグレーに変更するだけです。あなたがおそらく何をするつもりだったか:

rgbArray[i]=0x808080;  //Changing pixel values to grey

これにより、すべてのピクセルが灰色に変わります。

// 編集:

もちろん、すべてのピクセルはまったく同じ (灰色) であり、これはより少ないコードで実行できます。

    Graphics2D g2 = buff.createGraphics();
    g2.setColor(Color.grey);
    g2.fillRect(0, 0, buff.getWidth(), buff.getHeight());
    g2.dispose();

カラー画像ではなく白黒画像が必要な場合は、次の方法を試してください。

    BufferedImageOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
    buffer =  op.filter(buffer, null);
于 2012-01-14T16:56:16.263 に答える