문제

Windows BMP 형식의 이미지를 나타내는 바이트 배열이 있으며 라이브러리를 Java 응용 프로그램에 제시하기를 원합니다. BufferedImage, 없이 픽셀 데이터 복사.

주요 문제는 모든 구현이라는 것입니다 Raster BMP 픽셀 데이터는 하향식 왼쪽에서 오른쪽으로 순서대로 JDK Store 이미지 픽셀에서 왼쪽에서 오른쪽으로 저장됩니다. 이것이 보상되지 않으면 결과 이미지가 수직으로 뒤집 힙니다.

가장 명백한 "솔루션"은 SampleModel'에스 scanlineStride 부동산 값으로의 속성과 밴드 오프셋 (또는 DataBuffer상단 왼쪽 픽셀을 가리키기 위해 배열 오프셋, 즉 배열의 마지막 줄의 첫 번째 픽셀을 가리 킵니다. 불행히도 이것은 모든 것이 작동하지 않습니다 SampleModel 마이너스가 주어지면 생성자는 예외를 던집니다 scanlineStride 논쟁.

나는 현재 그것을 강요함으로써 그 주위에서 일하고있다 scanlineStride 반사를 사용하여 음수 값으로 필드를 사용하지만 가능하면 더 깨끗하고 휴대 가능한 방식으로 수행하고 싶습니다. 예를 들어, 다른 방법을 속이는 또 다른 방법이 있습니다 Raster 또는 SampleModel 상향식 순서로 픽셀을 배열하지만 캡슐화를 깨지 않고? 아니면 어딘가에서 포장 할 도서관이 있습니까? Raster 그리고 SampleModel, 픽셀 행을 역 순서로 표시합니까?

나는 다음과 같은 접근법을 피하는 것을 선호합니다.

  • 전체 이미지 복사 (성능 이유. 코드는 초당 수백 개의 큰 (> = 1mpixels) 이미지를 처리해야하며 전체 이미지가 응용 프로그램에서 사용할 수 있어야하지만 일반적으로 작은 경우에만 액세스합니다 (그러나 예측하기 어려운 경우 ) 이미지의 일부.)
  • 수정 DataBuffer 좌표 변환을 수행하려면 (이것은 실제로 작동하지만 다른 "더러운"솔루션이기 때문에 버퍼는 스캔 라인/픽셀 레이아웃에 대해 알 필요가 없기 때문입니다.)
  • 다시 구현 Raster 및/또는 SampleModel 처음부터 인터페이스 (적어도 SUN JDK에서 호환성 점검이 구현되는 방식으로 인해 특정 서브 클래스가 필요합니다. SampleModel 그래서 제네릭 BottomUpSampleModel 래퍼 클래스는 작동하지 않습니다.)
도움이 되었습니까?

해결책

나는 하나의 새로운 클래스 만 사용하여 이것을 구현할 수 있다는 것을 알았습니다. BottomUpComponentSampleModel. 확장됩니다 ComponentSampleModel 그리고 그 가치를 무효화합니다 scanlineStride 필드 (운 좋게도 protected 보다는 private) 슈퍼 클래스 생성자를 호출 한 후. 모든 픽셀 주소 계산은 잘 작동하지만 Raster.createWritableRaster (너무 작은 배열을 주면 감지하지 못할 수 있지만) 심각한 문제는 아닙니다.

이것은 필요하지 않습니다 MultiPixelPackedSampleModel 또는 SinglePixelPackedSampleModel, 그들은 부정적인 것을 받아들입니다 scanlineStride. 그들은 밴드 오프셋이 없지만, 이것은 오프셋을 설정하여 주변을 둘러 볼 수 있습니다. DataBuffer.

다른 팁

응용 프로그램 (또는 액세스 계층)이 이미지의 작은 (그러나 예측하기 어려운) 부분에 액세스 할 때 번역 및 플립 링이 사본에서 작동하는 것은 어떻습니까?

더 좋은 점은 응용 프로그램이 실제로 이미지를 표시 할 필요가없는 것처럼 들리나요? 왜 화면에서 올바르게 보일 수 있도록 처음에 그것을 뒤집기를 원하십니까? 가지고있는 버전에서 작동하는 논리를 작성하십시오. 그런 식으로 완충학을 가질 필요가 없습니다. 배열에서 직접 작업하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top