2012-04-22 2 views
1

Dicom 파일에서 이미지를 인쇄하려고합니다. 원시 데이터를 convertToFormat_RGB888 함수에 전달합니다. 내가 아는 한 Qt는 단색 16 비트 이미지를 처리 ​​할 수 ​​없습니다.Qt에서 uint16 단색 이미지를 인쇄하는 방법?

... 
else if (gimage.GetPixelFormat() == gdcm::PixelFormat::UINT16) 
    { 
     short *buffer16 = (short*)buffer; 
     unsigned char *ubuffer = new unsigned char[dimX*dimY*3]; 
     unsigned char *pubuffer = ubuffer; 
     for (unsigned int i = 0; i < dimX*dimY; i++) 
     { 
      *pubuffer++ = *buffer16; 
      *pubuffer++ = *buffer16; 
      *pubuffer++ = *buffer16; 
       buffer16++; 
     } 
     imageQt = new QImage(ubuffer, dimX, dimY, QImage::Format_RGB888); 
... 

이 코드는 여기에서 약간의 적응이다 ...이 내부로 들어가,이 함수 내부 http://imageshack.us/photo/my-images/839/16bitc.jpg/

bool convertToFormat_RGB888(gdcm::Image const & gimage, char *buffer, QImage* &imageQt) 

:

여기 (여기 JPG로 변환) 원본 이미지의 : gdcm.sourceforge.net/2.0/html/ConvertToQImage_8cxx-example.html

하지만 원래 가지고있는 실행 오류. 적어도 내 것을 사용하면 이미지를 얻지 만 같은 것은 아닙니다. http://imageshack.us/photo/my-images/204/8bitz.jpg/

내가 잘못 뭐하는 거지 :

여기에 새 이미지 (여기 JPG로 변환)입니다? 감사합니다. .

답변

0

수동으로 버퍼의 픽셀 값을 가져 와서 QImage :: setPixel에 전달하십시오. 단순해질 수 있습니다.

0

여기서, 8 비트의 변수에 16 비트 정수들을 할당된다

*pubuffer++ = *buffer16; 

을 결과는 정의되지 대부분의 컴파일러는 다만 대상의 하위 8 개 비트를 이동. 상위 8 비트를 원한다.

*pubuffer++ = (*buffer16) >> 8; 

다른 문제는 엔디안 방식이다. 원본 데이터의 endianness에 따라 QtEndian 함수 중 하나를 호출해야 할 수 있습니다.

마지막으로 32 비트 또는 24 비트 Qt 이미지 형식을 사용할 필요가 없습니다. 8 비트 QImage::Format_Indexed8을 사용하고 회색으로 color table을 설정하십시오.

+0

첫 번째 제안을 사용하면 다음 이미지를 얻을 수 있습니다. http://imageshack.us/photo/my-images/802/answer.jpg/ 훨씬 더 어두워 지지만 원하는 이미지에 더 가깝습니다. 이제 색상 표를 변경하려고하는데 잃어 버렸습니다. Qt의 설명서와 Google을 읽고이를 개선 할 수 있는지 알아 보겠습니다. –

+0

QVector 표 (256)로 색상 표를 변경하려고했습니다.for (int i = 0; i <256; ++ i) { table [i] = qRgb (i, i, i); } imageQt-> setColorTable (table); 나는 같은 이미지를 얻는다. 나는 붙어있다. –

+0

buffer16의 타입을 unsigned short로 변경하는 것은 어떻습니까? 서명되지 않은 서명에서부터 서명 된 서명 유형이 아마도 엉망이되었습니다. –