【问题标题】:BufferedImage does not keep transparency when HSB values for an images is changed更改图像的 HSB 值时,BufferedImage 不保持透明度
【发布时间】:2012-12-25 19:06:48
【问题描述】:

我正在开发一个简单的图像程序,用户可以在其中更改图像的 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 值,然后创建新图像而不丢失图像透明度?

编辑: 下面是应用了一些随机色调、饱和度和亮度之前和之后的图像。如您所见,图像失去了透明度。

【问题讨论】:

  • 如需尽快获得更好的帮助,请发布SSCCE。以代码或热链接生成图像。此外,鉴于混乱的文字和符号不包含“?”提示我问。你有问题吗?
  • 看看我所做的编辑,如果您需要更多信息,请告诉我。我正在尝试保持图像的透明度,但我得到的是黑色而不是 alpha 值应该是的地方。谢谢。

标签: java image transparency bufferedimage hsb


【解决方案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] (alpha) 似乎没有转换。 使用image.getAlphaRaster() 可能是解决方案。

【讨论】:

  • 谢谢,我不知道 Java 中的 getAlphaRaster() 和光栅。我会试一试,让你知道。
【解决方案2】:

感谢 Joop Eggen 为我指明了正确的方向。我直接将调整后的色调、饱和度、亮度和 alpha 值写入图像光栅(使用 setPixel())。下面是一篇讨论该主题的精彩文章。

Article.

【讨论】:

  • 太棒了;感谢您分享您的进一步研究。不过,我对文章链接有一个(暂时的?)问题。
猜你喜欢
  • 2016-12-02
  • 2019-04-14
  • 2012-07-18
  • 1970-01-01
  • 2013-01-12
  • 2021-10-08
  • 2016-09-02
相关资源
最近更新 更多