#include #include #include #include #pragma comment(lib,"cv.lib") #pragma comment(lib,"cxcore.lib") #pragma comment(lib,"highgui.lib") void bitConvert(void *out, int outBit, void *in, int inHeight, int inWidth, int inChannel, int inBit); int main(){ IplImage *in, *out; int i,j; in = cvLoadImage("./image640.bmp", 0); out = cvCreateImage(cvSize(in->width, in->height), 16, in->nChannels); bitConvert((void*)out->imageData, out->depth, (void*)in->imageData, in->height, in->width, in->nChannels, in->depth); cvNamedWindow("in", 1); cvShowImage("in", in); cvNamedWindow("out", 1); cvShowImage("out", out); cvWaitKey(-1); cvDestroyWindow("in"); cvDestroyWindow("out"); cvReleaseImage( &in ); cvReleaseImage( &out ); return 0; } void bitConvert(void *out, int outBit, void *in, int inHeight, int inWidth, int inChannel, int inBit){ int i, j; unsigned short tmp; double coefficient; unsigned short max; unsigned char *tmpAd8; unsigned short *tmpAd16; // 係数 coefficient = pow(2.0, (outBit - inBit)); // 最大値 max = (unsigned short)(pow(2.0, outBit) - 1); for(i = 0; i < inHeight; ++i){ for(j = 0; j < inWidth; ++j){ switch(inBit){ case 8: tmp = (unsigned short)(*((unsigned char *)in + i * inWidth + j) * coefficient); break; case 10: case 12: case 16: tmp = (unsigned short)(*((unsigned short *)in + i * inWidth + j) * coefficient); break; } // max超えることはないが、念のため if(tmp > max){ tmp = max; } switch(outBit){ case 8: *((unsigned char *)out + i * inWidth + j) = tmp; break; case 10: case 12: case 16: *((unsigned short *)out + i * inWidth + j) = tmp; break; } } } }