2011-06-10 2 views
2

이미지를 uint16에서 uint8로 변환하는 방법을 찾으려고합니다. 기본적으로 float로 이미지를 읽어야하므로 unsigned char로 표시해야합니다.QT에서 16bit QImage를 8bit unsigned char로 변환하십시오.

float two_eight = pow(2.0,8); 
    float two_sixteen = pow(2.0,16); 
    QImage *qi = new QImage(imwidth, imheight, QImage::Format_RGB32); 
     for (int i = 0 ; i < imheight ; i++) 
     { 
      for (int j = 0 ; j < imwidth ; j++) 
      { 
        floatData[i*imwidth+j] = (two_eight* floatData[i*imwidth+j])/two_sixteen; 
        qi->setPixel(j,i,qRgb((unsigned char)floatData[i*imwidth+j],(unsigned char)floatData[i*imwidth+j],(unsigned char)floatData[i*imwidth+j])); 


      } 
     } 

는 Qt는이를 수행하는 더 나은 방법이 있나요 :

나는 다음 있나요?

답변

1

, 당신은 각 색상 구성 요소는 16 비트 RGB 형식의 이미지를 가지고, 당신이 사용 QImage를로드 할.

이처럼 수행 할 수 있습니다 Convert 기능은 다음과 같이 정의된다

std::vector< unsigned short int > inData; 
// load the data into a vector 
std::vector< unsigned char > outData(inData.size(), 0); 
std::transfrorm(inData.begin(), inData.end(), outData.begin(), Convert); 
// create the image object 
QImage image(&outData[0],imwidth, imheight, QImage::Format_RGB32); 

:

unsigned char Convert(const unsigned short int v) 
{ 
    return v >> 8; 
} 
+0

QImage는 채널당 16 비트 이미지를 지원하지 않습니다. – vines

+0

@vines 제가 알고 있는데, 그 이유는 먼저 16 비트 데이터 ('inData' 벡터에 저장 됨)를 8 비트 데이터 ('outData' 벡터) 8 비트 데이터를 사용하여 QImage를 생성합니다. –

+0

아, 죄송합니다. 서두르다. – vines

1

IMDATA 내가 제대로 질문을 이해 경우 16 비트 이미지 버퍼

#include <cstdint>  
uint16_t *imdata; 

    for (int i = 0 ; i < imheight ; ++i) 
      { 
       //preincrement, is faster than post 
       for (int j = 0 ; j < imwidth ; ++j) 
       { 
         //imdata[i*imwidth+j]>>8 removes least significant 8bits 
         //imdata has one added to adjust for components 
         qi->setPixel(j,i,qRgb((uint8_t)(imdata[i*imwidth+j]>>8),(uint8_t)(imdata[i*imwidth+j+1]>>8),(uint8_t)(imdata[i*imwidth+j+2]>>8))); 


       } 
      } 
+0

선행 증가가 후보다 빠르다?! 물론 컴파일러가 쉬운 최적화를 할 권한이 없다면. 프로덕션 코드의 경우 일반 컴파일러에서 컴파일되므로 바이너리에는 차이가 없습니다. – mbx

+0

나는 그것이 무의식적으로 보이기 때문에 더 멋지게 보인다라고 생각한다.) 그 위에 우리는 어떤 컴파일러가 사용되는지 알지 못한다. 나는이 작은 변화가 LLVM과 GCC 컴파일러에 대해 증명할 수있는 차이를 만들어 냈다는 것을 알았고 사전 증가가 그 어느 때보 다 느릴 수는 없다. –

+0

질문에 게시되는 내용보다 빠를 것입니다. 그러나 당신은 여전히 ​​픽셀 당 픽셀을 2 for 루프로 설정하고 있습니다. 이것은'-OS' 나'-O2'를 사용해도 접근 방식이 –

관련 문제