当图像的HSB值发生更改时,BufferedImage不保持透明度

时间:2012-12-25 19:06:49

标签: java image transparency bufferedimage hsb

我正在开发一个简单的图像程序,用户可以在其中更改图像的HSB值。但是,当我更改图像的HSB值并转换回RGB时,它似乎失去了透明度或alpha值(透明度为黑色)。以下是我在下面的内容(我已将相关部分放在一起):

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),因此应保留alpha值。但是改变图像HSB值导致新的缓冲图像具有透明度应该是黑色。如何编辑图像HSB值,然后创建新图像而不会丢失图像透明度?

编辑: 下面是一些随机色调,饱和度和亮度之前和之后的图像。如您所见,图像已失去透明度。 enter image description here

2 个答案:

答案 0 :(得分:2)

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

哪个很难看。 hsb [3](alpha)似乎没有转换。 使用image.getAlphaRaster()可能是解决方案。

答案 1 :(得分:1)

感谢Joop Eggen指出我正确的方向。我直接写入图像栅格(使用setPixel())调整的Hue,饱和度,亮度和alpha值。以下是一篇讨论主题的精彩文章。

Article.