我正在使用C ++处理图像。此格式可以保存8/16/32位整数和32/64位浮点数组。像素大小(变量类型)包含在标题标志中。 当我使用cfitsio库[http://heasarc.gsfc.nasa.gov/fitsio/]阅读其中一个图像时,我得到一个包含图像所有像素的字符数组:
char* array = new char[npix*bytepix]; // bytepix is the number of bytes per pixel
fits_read_img(infptr, datatype, first, npix, &nulval, lArray, &anynul, &status);
然后我可以通过类型转换获得像素的“真实”值。 I.E.为了获得32位整数的第i个像素的值,我会这样做:
int32_t pixelValue = ((int32_t*) lArray)[i];
我想知道一般来说处理这个问题的最简洁方法是什么,因为我不知道编写代码时像素类型是什么。
我目前的做法是这样的:
switch(bytepix){
case 1:{
int8_t *vecVal = ((int8_t*) array );
}
break;
case 2:{
int16_t *vecVal = ((int16_t*) array );
}
break;
case 4:{
int32_t *vecVal = ((int32_t*) array );
}
break;
case 8:{
int64_t *vecVal = ((int64_t*) array );
}
break;
default:
cout << "error\n";
break;
}
}
这显然是丑陋而且不够灵活。
非常感谢你的帮助!
答案 0 :(得分:0)
您尝试做的事情称为泛型编程。这是分解算法及其操作类型的基本概念。 C ++中支持模板函数和模板类,整个C ++标准模板库都基于它。
基本上,独立于FITS像素大小实现处理功能:
template<typename Pixel>
void ProcessImage(Pixel *array, const int arr_length) {
...
}
然后使用相应的像素大小调用它:
...
case 1:
ProcessImage<int8_t>(reinterpret_cast<int8_t *>(array), arr_length);
break;
case 2:
ProcessImage<int16_t>(reinterpret_cast<int16_t *>(array), arr_length);
break;
...
有几点想法: