0

私は、ユーザーが画像のHSB値を変更できる単純な画像プログラムに取り組んでいます。ただし、画像のHSB値を変更してRGBに戻すと、透明度またはアルファ値が失われているように見えます(透明度がある場所では黒になります)。これが私が以下に持っているものです(私は関連する部分をまとめました):

public static BufferedImage getEnhancedImagesHSB(BufferedImage image, float[] hsbOrg)
{

  int height = image.getHeight();
  int width = image.getWidth();

  float[] hsb = new float[]{0,0,0,0};
  int[] originalPixels = image.getRGB(0,0, width, height, null, 0, width);
  int[] enhancedImagePixels = image.getRGB(0,0, width, height, null, 0, width);

  for (int i = 0; i < originalPixels.length; i++)
  {
    Color c = new Color( originalPixels[i]);
    int red =c.getRed();
    int green = c.getGreen();
    int blue = c.getBlue();

    hsb = Color.RGBtoHSB(red, green, blue, hsb);

    hsb[ 3 ] = c.getAlpha() / 255f;

     hsb[0] = (float)(hsb[0] +( hsbOrg[0]/360.0));//hue

    hsb[1] *=  (hsbOrg[1]/100);
      if(hsb[1] > 1.0)
          hsb[1] = (float)0.9;


    hsb[2] *=  (hsbOrg[2]/100);
      if(hsb[2] > 1.0) 
          {hsb[2] = (float)0.9;}

    enhancedImagePixels[i] = Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]);
  }


  BufferedImage newImage = new BufferedImage(width, height,    BufferedImage.TYPE_INT_ARGB  );  
  newImage.setRGB(0, 0, width, height, enhancedImagePixels, 0, width);

  return newImage;
}

ドキュメントgetRGB()によると、setRGB()はデフォルトのRGBカラーモデル(TYPE_INT_ARGB)を使用するため、アルファ値を保持する必要があります。ただし、画像のHSB値を変更すると、透明度が必要な場所に黒色の新しいバッファリングされた画像が作成されます。画像のHSB値を編集してから、画像の透明度を失わずに新しい画像を作成するにはどうすればよいですか?

編集:以下は、ランダムな色相、彩度、明るさを適用する前後の画像です。ご覧のとおり、画像の透明度が失われています。 ここに画像の説明を入力してください

4

2 に答える 2

1
Color c2 = Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]);
enhancedImagePixels[i] = new Color(c2.getRed(), c2.getGreen(), c2.getBlue(),
        c.getAlpha());

これは醜いです。hsb [3](アルファ)の変換はないようです。を使用するimage.getAlphaRaster()ことが解決策かもしれません。

于 2012-12-26T16:30:53.977 に答える
1

私を正しい方向に向けてくれたJoopEggenに感謝します。調整された色相、彩度、明るさ、アルファ値を(setPixel()を使用して)画像ラスターに直接書き込みました。以下は主題を議論する素晴らしい記事です。

記事。

于 2012-12-26T19:53:40.373 に答える