2014-08-28 3 views
0

QImage에서 이미지 색상에 액세스하려고합니다.RGB32 및 인덱싱 된 유형 이미지 모두에서 이미지 색상 정보 가져 오기

내가 주사선 기능을 기반으로 문서의 대부분을 발견하는 방법 ...

나는 시도하고 일했다 ... RGB32 이미지에. 정확한 방법을 사용하여 8 비트 색인 또는 흑백 이미지에 대한 색상 데이터를 얻을 때 놀랍고 불쾌한 결과를 얻었습니다. 이미지가 인덱스 또는 흑백, 나는 점점 색을 만드는 오류를 가지고 8 비트와 동일한 코드를 실행

// note RGBTriple is a struct containing unsigned R, G, B 
// rgbImage.pixels is a RGBTriple* array 

RGBTriple* pTriple = rgbImage.pixels; 
for (int y = 0; y < source.height(); y++) 
{ 
    const unsigned char* pScanLine = source.scanLine(y); 
    for (int x = 0; x < source.width(); x++) 
    { 
     QRgb* color = (QRgb*)pScanLine; 
     pTriple->R = qRed(*color); 
     pTriple->G = qGreen(*color); 
     pTriple->B = qBlue(*color); 
     ++pTriple; 
     pScanLine += 4; 
    } 
} 

:

내 코드이었다. 문서는 주사선이 32b의 배수로 정렬되었다고 말합니다. 그러나 8과 2의 배수이기 때문에 문제가 될 것이라고는 생각하지 않았습니다. 그것은 느린이나 다른 예기치 않은 동작을한다면 내가 입력 이미지의 모든 유형에 대한 올바른 결과를 얻고 있지 오전 발견되면

, 나는

완벽하게
RGBTriple* pTriple = rgbImage.pixels; 
for (int y = 0; y < source.height(); y++) 
{ 
    for (int x = 0; x < source.width(); x++) 
    { 
     pTriple->R = qRed(source.pixel(x, y)); 
     pTriple->G = qGreen(source.pixel(x, y)); 
     pTriple->B = qBlue(source.pixel(x, y)); 
     ++pTriple; 
    } 
} 

작품에 변경 ... 궁금 ? 결국, 인덱스 된 이미지에서도 pixel() 함수를 사용하여 색상 정보를 얻습니다. 실제로는 다르게 저장해야합니다 ... 실패 할 것 같아서 ...

scanline을 사용하는 첫 번째 버전은 다른 이미지 유형에서도 작동합니까?

왜 데이터를 얻기 위해 스캔 라인을 사용하는 것이 바람직한 방법입니까?

+1

"느린"적어도 – hyde

답변

1

RGB32 이미지에서 시도해 보았습니다. 놀라운 결과를 얻었습니다. 정확한 방법을 사용하여 8 비트 색인 또는 흑백 이미지의 색상 데이터를 가져올 때 불쾌한 결과가 나타납니다.

당신은 인덱스와 흑백 이미지가 다른 형식이기 때문에 놀라지 않을 것이다. 게시 한 첫 번째 코드 스 니펫은 RGB32 (및 RGB32 만 해당)이 메모리에 어떻게 레이아웃되었는지에 대한 지식을 기반으로합니다.

생각해보십시오. 단색 이미지에서 R=G=B. 따라서 하나의 채널 만 메모리에 저장해야합니다. 당신의 목표는 rgbImage.pixels 사용 QImage::convertToFormat() 내부 RGB 이미지를 얻을 경우

: 약

QImage source; 
QImage dest = source.convertToFormat(QImage::Format_RGB888); 
memcpy(rgbImage.pixels, dest.bits(),dest.byteCount()); 
+0

... 임시 변수에 한 번만 pixel' 및 저장 반환 값'부르는 rgbImage.pixels의 내용이 될 것입니까? 그것은 각 색상에 대해 하나의 char을 가진 unsigned char *의 배열이 될 것인가? size의 3 배인 byteCount입니까? – Thalia

+0

예, 그것은 arrawy rgbrgbrgb .... 각 색상은 서명되지 않은 char입니다. rgb24의 dest.byteCount는 이미 3 * width * height 바이트 길이입니다. 그리고 나는 rgbImage.pixels가 같은 크기 일 것을 기대합니다. – UmNyobe