2016-06-07 4 views
1

이미지의 픽셀의 1 차원 바이트 배열을 1 차원 정수 배열로 변환하려고합니다. 스레드에서 "주요"java.lang.ClassCastException가를 예외 : 나는이 코드를 컴파일하고 때마다1D 바이트 배열을 1D 정수 배열로 변환

Byte[] pixels = (Byte[]) img.getRaster().getDataElements(0, 0, width, height, null); 

int[] array = new int[pixels.length]; 

for (int k = 0; k < pixels.length; k++);{ 
    array[k] = pixels[k++]; 
} 

, 내가 아래 런타임 예외를 얻고있다 : 나는 아래에 다음 코드를 [B가 캐스팅 될 수 없다 ~ [Ljava.lang.Byte;

+0

사이드 노트 :'img.getRaster()'가 당신 자신의 코드 인 경우 --- Byte의 배열을 반환하지 말고 바이트를 고려하십시오. 당신은 정말로 컴파일러에 대해 조심하고 싶습니다 권투/unboxing 모든 곳; 그러한 것들이 더 큰 데이터 세트에 대한 귀하의 실적에 상당한 영향을 미칠 수 있습니다. – GhostCat

+0

나는 다시 시도했지만 동일한 예외가 발생했습니다 : "main"스레드의 예외 java.lang.ClassCastException : [B를 [Ljava.lang.Byte; –

+0

@ Jägermeister'img.getRaster()'는 커스텀 코드가 아니지만 아마도'BufferedImage # getRaster()'일 것이다. – Thomas

답변

1

픽셀은 Byte 객체의 배열입니다. 그것을 int 배열에 할당하려고합니다. 이 같은이 있어야합니다 array[k] = pixels[k++].intValue();

3

난 당신이 intValue()

  • 당신은 두 번 지역 변수를 증가 호출 할 필요가 int

    1. 가 원시 형에 Byte을 변환하려면 코드에서 3 문제를 참조 k 등 배열 크기를 초과 할 것임
    2. 예외에 따라 잘못된 캐스트를 수행하면 getDataElements
    을 반환합니다.

    요청 화소 데이터 은 getTransferType()에 의해 정의 유형의 배열에 객체 참조.

    따라서 먼저 캐스팅 방법을 알아 보려면 getTransferType()을 확인해야합니다. 그러나 Byte[] pixelsbyte[] pixels이되도록 래퍼 클래스 Byte의 배열 대신 프리미티브 유형 byte의 배열 인 것으로 보입니다.

    그래서 예상되는 코드는 다음과 같아야합니다

    for (int k = 0; k < pixels.length; k++);{ 
        array[k] = pixels[k]; 
    } 
    
  • 1

    문제는 Raster#getDataElements() 귀하의 경우에 byte[] 배열 ([B)을 (img.getRaster()DataBuffer.TYPE_BYTE을 가장 가능성이 WritableRaster 및 래스터의 유형을 반환) 반환합니다. 그러나 당신은 배열 ([Ljava.lang.Byte)로 캐스팅하려고합니다. 자동 변환이 없기 때문에 ClassCastException이됩니다.

    대신 코드를 변경하여 byte[]을 사용하면됩니다.

    관련 문제