` 本帖最后由 jinyi7016 于 2016-4-19 07:30 编辑
由于一些imglib的函数所需的图像像素不同,若是一定要使用imglib的函数,要就要进行像素的转换了。 下面这个是将8位像素扩展到16位像素的函数,可以看到只是一个数据类型的转换了。 在此之前也是判断了输入、输出数据是不是8字节对齐的。
- void IMG_pix_expand
- (
- int n,
- const unsigned char *restrict in_data,
- short *restrict out_data
- )
- {
- int i;
- _nassert((int) in_data % 8 == 0);
- _nassert((int) out_data % 8 == 0);
- #pragma MUST_ITERATE(16,,16);
- #pragma UNROLL(16);
- for (i = 0; i < n; i++)
- out_data[i] = in_data[i];
- }
复制代码
而对于16位像素缩减到8位像素的函数,就是要将大于255的设置为255,小于0的置为0。由于输入是short类型的数据,所以会有小于0的情况。 而对于8位灰度图,它的像素值总是在0~255之前,所以经过两次变换后,应与原8位灰度图是一样的。
- void IMG_pix_sat
- (
- int n,
- const short *restrict in_data,
- unsigned char *restrict out_data
- )
- {
- int i;
- if (!n) return;
- _nassert((int) in_data % 8 == 0);
- _nassert((int) out_data % 8 == 0);
- /* -------------------------------------------------------------------- */
- /* Process incoming pixels up to 16 at a time. */
- /* -------------------------------------------------------------------- */
- #pragma MUST_ITERATE(8,,8);
- #pragma PROB_ITERATE(32);
- #pragma UNROLL(4);
- for (i = 0; i < n; i += 4)
- _amem4(&out_data[i]) = _spacku4( _hill(_amem8_const(&in_data[i])),
- _loll(_amem8_const(&in_data[i])) );
- }
复制代码
前面已经将24位真彩转成了8位灰度图,那么现在将8位灰度图转成16位再将16位转换回8位,结果应该是与原图一样的。 实现过程如下:
- IMG_pix_expand(bmpWidth*bmpHeight,Image,out);
- IMG_pix_sat(bmpWidth*bmpHeight,out,Image);
复制代码
第一个参数是图像的像素,也就是高*宽。 最后的结果是与原图相同的,如下:
最后和源码与二进制文件会在最后的结项中。
`
|