2014-02-24 9 views
3

** 중요 업데이트, 아래 참조! **BufferedImage에서 setRGB를 수행하면 픽셀이 색상 대신 검은 색으로 변경됩니다.

BufferedImage의 픽셀을 Java에서 일련의 조건을 충족 할 때 특정 색상으로 변경하는 프로그램을 만듭니다. 그러나 이미지를 디스크에 쓸 때 색상이 지정되어야하는 픽셀은 검정색으로 표시됩니다.

먼저 내가 RGB 코드를 사용하여 색상을 정의 :

Color purple = new Color(82, 0, 99); 
int PURPLE = purple.getRGB(); 

가 그럼 난 "빈"라는 BufferedImage에 내가 파일에서 변경하고자하는 이미지를 읽기 : 이제

BufferedImage blank = ImageIO.read(new File("some path")); 

, 픽셀을 반복하고 위치 (x, y)의 픽셀이 기준과 일치하면 해당 색상을 자주색으로 바꿉니다.

blank.setRGB(x, y, PURPLE); 

이제 "blank"를 디스크에 씁니다.

File output = new File("some other path"); 
ImageIO.write(blankIn, "png", output); // try-catch blocks intentionally left out 

결과 파일은 보라색 픽셀로 "공백"이어야하지만 문제의 픽셀은 검은 색입니다. 나는 "blank"자체가 컬러 이미지이기 때문에 그 문제가 setRGB와 가져 오기 또는 내보내기 기능이 아니라는 사실을 알고 컬러 파일이므로 파일에 기록됩니다. 필자는 Graphics2D를 사용하고 setRGB를 피하도록 추천하는 게시물을 많이 보았지만 픽셀 별 색상 변경에 대한 논의는 없었습니다.

또한 다음과 같이 직접 비트 조작 시도

:

blank.setRGB(x, y, ((82 << 16) + (0 << 8) + 99)); 

내가 아마 잘못하고 있어요,하지만 난 제대로에 넣어 경우 픽셀이 투명으로 설정지고 있기 때문에, 문제가되지 것입니다 내가 이것을 할 때 (숫자가 무엇을 말하는 것과 상관없이, 그것은 매우 이상하다.).

는 ** 난이 때 : 즉 그레이 스케일로 내 사진을 수정에서는 setRGB는 사실을 의미하므로

blank.setRGB(x, y, Color.RED.getRGB()); 

내 출력 파일, 그레이 스케일이다. 나는 이것이 실제로는 다소 간단한 문제라고 생각하지만 해결책은 나를 벗어난다.

답변

3

https://stackoverflow.com/a/21981173의 통찰력을 바탕으로 ... (질문 게시 후 몇 분) ...로드 한 직후에 이미지를 ARGB로 변환하는 것만으로도 충분할 것으로 보입니다.

+0

답변이 내 것보다 훨씬 효율적입니다! – itsmichaelwang

1

Java로 가져온 원본 이미지는 실제로는 회색조이므로 Java가 BufferedImage로 읽을 때 단순히 그 이미지를 그레이 스케일 BufferedImage로 가져 왔습니다. 이미지의 구석에 아주 작지만 눈에 띄지 않는 색깔의 점을 추가함으로써 자바를 올바르게 컬러 이미지로 출력 할 수있었습니다.

프로그래밍 방식으로이 문제를 해결하는 방법을 모르기 때문에이 방법은 절반의 해결책입니다.

해결 방법 : 이 조각과 ARGB하는 그레이 스케일에서 BufferedImage를 변환 :

BufferedImage blank2 = blank; 
    // Create temporary copy of blank 
blank = new BufferedImage(blank.getWidth(), blank.getHeight(), BufferedImage.TYPE_INT_ARGB); 
    // Recreate blank as an ARGB BufferedImage 
ColorConvertOp convert = new ColorConvertOp(null); 
    // Now create a ColorConvertOp object 
convert.filter(blank2, blank); 
    // Convert blank2 to the blank color scheme and hold it in blank 

당신은 blank = ImageIO.read(new File("some path")) 후이 권한을 추가 할.