먼저이 파일이 중복되면 내 질문에 답하는 제목을 찾을 수 없습니다.정확하게 float 32를 부호없는 short 또는 unsigned char로 변환하십시오.
32 비트 부동 소수점 값을 short int (16 비트) 및 unsigned char (8 비트) 값으로 변환하는 데 사용할 약간의 프로그램을 코딩하고 있습니다. 이것은 HDR 이미지 용도입니다.
static inline uint8_t u8fromfloat(float x)
{
return (int)(x * 255.0f);
}
내가 같은 방법으로 우리는 (pow(2,16) -1)
을 곱하여 짧은 INT를 얻을 수 있다고 생각하지만 나는 결국 :
here 에서 나는 (클램핑없이) 다음 함수를 얻을 수 주문한 디더링 및 특히 바이어 디더링에 대해 생각합니다. uint8_t로 변환하려면 4x4 행렬과 8 * 8 행렬을 부호없는 short로 사용할 수 있다고 가정합니다. I는 룩업 테이블 생각
스피드 업하는 프로세스, 이러한 방법 :
uint16_t LUT[0x10000] // 2^16 values contained
저장 2^16 개의 짧은 부호 값 플로트에 대응한다. 이 같은 테이블은 다음 사이에 있기 때문에 암시 적 캐스트의뿐만 아니라 uint8_t에 사용될 수 서명되지 않은 짧은 < ->
INT 부호하지만이 같은 룩업 테이블은 메모리에 큰되지 않을 것? 또한 어떻게이 테이블을 채울 것입니까?!이제 혼란 스럽 습니다만, 당신에게 가장 좋은 것은 무엇입니까? 도움 주셔서 감사합니다!
uwind 대답 이후에 EDIT : U8/U16으로 변환하기 전과 동시에 색상 공간 변환 (float)을 수행 한 다음 기본 색상 공간 변환을 수행하고 싶다고 가정 해 보겠습니다. ~ U8/U16. 이 경우에 너트를 사용하는 것이 더 효율적이지 않겠는가? 그리고 그래, 난 여전히 lut 색인에 문제가있을 것입니다 ..
.
테이블 조회를 병렬화 할 수 없기 때문에 더 그렇게 LUT 방법을 쉽게 능가 할 것이다 4-8x 성능이 향상됩니다. – Jodrell
예는, 나는 C/C++ – Lex