当前位置:编程学习 > C/C++ >>

使用wxWidget中遇到的图片存储问题一二

1. 实验室中CCD的实际色阶为14位,获取的原始图像数据的每个值都存储在一个字中,即存储色阶16位,也就是说最高两位的数据一直为0,同时获取的图片信息仅仅是16色阶的灰度图,而采用wxWidget没有办法直接将16位的数值串保存为图片格式,如tiff格式,那么如何将16位的数值串以图片的形式进行保存呢?

    经过这么几天的折腾总算是找到了一条解决的途径,就是将16位的数值串转化为8为的数值串,也许你会很快的想到这么一个方法,nValue*max(uint8)/max(uint16);用来表示转化后的数值,不够还是得考虑一下CCD的实际色阶,由于是14位,因此可以采用这样的方式nValue*max(uint8)/max(uint14);不过由于我们对于图片的处理是直接对图片的原始数据进行处理,而转化只是图片在显示屏上显示的前提步骤,采用上述的方式虽然能够相对很准确的进行转化,但是需要花费一定的计算量,而通过近似的转化能够更快的进行这个转化过程,同时获取得到的图片依然具有较好的清晰度,下面细说一下我采用的方法:

   1: unsigned short nPicData16 = new unsigned short[nBufSize];   // nBufSize is the size to store pic
   2: 
   3: // to get the nPicData16
   4: // ..................
   5: // get the nPicData16
   6: 
   7: char *pcPicData8 = new char[nBufSize];
   8: for (size_t i = 0; i < nBufSize; ++i) {
   9:   pcPicData8[i] = (char)(nPicData16>>6);
  10: }
  11: 
  12: 

由于2^6在2^14中所占的比例较小因此可以采用这样的近似的方法。(这种方法具体有什么作用或是缺陷还没有细究,请各位看官给点看法)www.zzzyk.com

2. 顺利将14位数值串转化成为8为数值串后,尝试的使用下列方式进行图片保存,发现结果一片黑,数值都为0了:

   1: // 结果发现存储得到的save.bmp图是24b的
   2: wxBitmap bitmap(pcPicData8,1392,1040,8);
   3: bitmap.SaveFile(wxT("save.bmp"),wxBITMAP_TYPE_BMP);
   4: 

因此猜想wxWidget对直接获取的数据串进行保存时采用的rgb的模式进行保存,可能只会保存为24字节格式的图片,也就是想要将图片显示到屏幕上时,也应该采用24b的图片。不过wxWidget对于图片数据却能够读取8位的图片,但是再次采用上述的方式进行存储时,变成了32字节的了,(各位大虾知不知道有没有方法能够直接保存8位图的呢)。

于是采用了将这个8位的数值串分别赋值给R,G,B,用这种方式实现灰度图的创建,然后再进行保存,最终解决了问题。

   1: unsigned char *rgbData = new unsigned char[1392*1040*3];
   2: unsigned char *ptr1 = (unsigned char*) pcPicData8;
   3: unsigned char *ptr2 = rgbData;
   4: for (int i = 0; i < 1392*1040; ++i) {
   5:     *ptr2++ = *ptr1;  
   6:     *ptr2++ = *ptr1;
   7:     *ptr2++ = *ptr1++;
   8: }
   9: wxImage myImage(1392,1040,rgbData);
  10: myImage.SaveFile(wxT("save.bmp"),wxBITMAP_TYPE_BMP);


作者:钟谢伟
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,