2012-12-25 12 views
0

사용자가 이미지의 HSB 값을 변경할 수있는 간단한 이미지 프로그램에서 작업하고 있습니다. 그러나 이미지의 HSB 값을 변경하고 RGB로 다시 변환하면 투명도 또는 알파 값이 손실되는 것처럼 보입니다 (투명도가있는 곳에서는 검은 색으로 변합니다).이미지의 HSB 값이 변경 될 때 BufferedImage는 투명도를 유지하지 않습니다.

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 값을 편집 한 다음 이미지 투명도를 잃지 않고 새 이미지를 만들려면 어떻게해야합니까?

편집 : 아래는 임의의 색조, 채도 및 밝기가 적용된 전후의 이미지입니다. 보시다시피 이미지의 투명성이 사라졌습니다. 못생긴 enter image description here

+0

더 도움이 빨리 들어, [SSCCE] (http://sscce.org/)을 게시 할 수 있습니다. 코드로 이미지를 생성하거나 이미지에 핫 링크하십시오. 또한 단어와 기호의 혼란에는 '?' 나는 묻는다. 질문 있습니까? –

+0

내가 작성한 수정 사항을 확인하고 추가 정보가 필요한 경우 알려주십시오. 나는 이미지의 투명도를 보존하려고 노력하고 있지만 알파 값을 가져야하는 대신 흑인을 얻습니다. 감사합니다. – Sun

답변

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()을 사용하는 것이 해결책 일 수 있습니다.

+0

고마워, 나는 자바에서 getAlphaRaster()와 래스터에 대해 알지 못했다. 나는 이걸 알려주고 알려줄거야. – Sun

1

나를 올바른 방향으로 가리키는 Joop Eggen에게 감사드립니다. 필자는 조정 된 색조, 채도, 밝기 및 알파 값을 이미지 래스터 (setPixel() 사용)에 직접 작성했습니다. 아래는 주제를 다루는 훌륭한 기사입니다.

Article.

+0

위대한; 귀하의 추가 연구를 공유해 주셔서 감사합니다. 나는 기사 링크에 (일시적인?) 문제가 있었지만. –