2016-09-27 3 views
1

입력 이미지를 받아 Java에서 출력 이미지를 생성하는 리샘플링 함수를 작성해야합니다.Java에서 이미지 픽셀에 효율적으로 액세스

이미지 유형은 TYPE_BYTE_GRAY입니다.

모든 픽셀을 읽고 쓸 것이므로 이미지 버퍼에 액세스하는 효율적인 방법이 필요합니다.

저는 getRGB/setRGB와 같은 메소드가 변환을 수행하기 때문에 적절하다고 생각하지 않습니다. 필자는 효율적인 주소 계산, 이미지 복사 및 최소 오버 헤드로 저장된 버퍼에 대한 가장 직접적인 액세스를 허용하는 기능을 수행하고 있습니다.

도와 주시겠습니까? 예를 들어 WritableRaster를 사용하는 등 많은 종류의 예제를 발견했지만 충분하지는 않습니다.


업데이트는 :

@FiReTiTi에 의해 제안

, 트릭은 이미지에서 WritableRaster을 가져오고 DataBufferByte 대상으로 관련 버퍼를 얻을 수 있습니다.

DataBufferByte SrcBuffer= (DataBufferByte)Src.getRaster().getDataBuffer(); 

그런 다음 당신은 직접 getElem/setElem 방법

SrcBuffer.setElem(i, getElem(i) + 1); 

를 사용하여 버퍼에 액세스 할 수 또는 바이트

byte [] SrcBytes= SrcBuffer.getData(); 
SrcBytes[i]= SrcBytes[i] + 1; 

두 방법 모두 작업의 배열을 추출 할 수있는 옵션이 있습니다. 아직 성능에 차이가 있다는 것을 알지 못합니다 ...

+0

당신이 당신이 이미지에서 검색 픽셀로하십니까? – px06

+0

@ px06 필자는 (사용자 지정) 리샘플링 함수를 작성하고 있지만 이것이 어떻게 영향을 미칠 수 있습니까? –

+0

두 번째는 배열에 대한 직접 액세스를 시작하므로 더 빨라야합니다. 그러나 그것이 얼마나 더 빠를지는 확신 할 수 없다. 다행 했어. – FiReTiTi

답변

2

가장 쉬운 방법은 (하지만 빠른)는 래스터 myimage.getRaster()을 사용하고 getSample(x,y,c)setSample(x,y,c,v)가 액세스 할 수있는 방법을 사용하여 픽셀 값을 수정하는 것입니다.

가장 빠른 방법은 DataBuffer (이미지를 나타내는 배열에 직접 액세스)에 액세스하는 것이므로 TYPE_BYTE_GRAY BufferedImage의 경우 byte[] buffer = ((DataBufferByte)myimage.getRaster().getDataBuffer()).getData()이됩니다. 픽셀이 byte에 인코딩되고 unsigned byte으로 인코딩되지 않도록 조심하십시오. 따라서 픽셀 값을 읽을 때마다 buffer[x] & 0xFF을 사용해야합니다. 출력

BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_BYTE_GRAY) ; 
byte[] buffer = ((DataBufferByte)image.getRaster().getDataBuffer()).getData() ; 
System.out.println("buffer[0] = " + (buffer[0] & 0xFF)) ; 
buffer[0] = 1 ; 
System.out.println("buffer[0] = " + (buffer[0] & 0xFF)) ; 

그리고 여기에 있습니다 : : 여기

은 간단한 테스트입니다

buffer[0] = 0 
buffer[0] = 1 
+0

(내 downvote 없습니다.)이 작동하지 않습니다, 이미지가 변경되지 않습니다. –

+0

코드를 공유 할 수 있습니까? 나는 매일 도서관에 그것을 사용하고 완벽하게 작동합니다 :-) – FiReTiTi

+0

그리고 투표 실패에 대한 걱정은 없습니다. 나는 싫어하는 사람들에게 익숙합니다. 당신 질문에 투표 한 것과 똑같은 사람이 분명합니다. – FiReTiTi

1

기본 버퍼 yourimage.getData().getDataBuffer()을 가져 오는 것은 가능하지만 하나의 긴 배열이므로 약간의 변환이 필요합니다. 일부 요소를 극한 값으로 설정하고 픽셀이 영향을받는 방식을보기 위해 그림을 렌더링하여 픽셀 순서를 찾을 수 있습니다.

+0

또한 픽셀을 변경해야합니다. 여기가 대부분 붙어 있습니다. 픽셀 오프셋을 계산하는 데 문제가 없습니다. –

+0

얻을 수있는 객체는 databuffer (https://docs.oracle.com/javase/7/docs/api/java/awt/image/DataBuffer.html)입니다. setElem을 사용하여 값을 설정할 수 있습니다. –

+0

왜 당신이 downvoted되었다는 생각. –

관련 문제