在做实验室项目时,需要将打印机扫描得到的raw扫描文件转换成bmp文件,进而对bmp文件进行旋转等处理。所以写了这篇博客,参考了https://blog.csdn.net/zhenhai308/article/details/74906078,但是这篇博客里面的raw图像是14bit的,而我实验室所扫描出来的raw图像是8位深的,一个像素占一个字节,所以就参考这篇博客并改进了。
raw原始图像文件包含从数码相机、扫描器或电影胶片扫描仪的图像传感器所处理数据。之所以这样命名,是因为他们尚未被处理,未被打印或用于编辑。一般raw图像都很大。
打印机扫描得到的raw文件,一般情况下右键属性不能看到它的长和宽,甚至普通的看图软件都没法查看图像,我使用ACDsee和PS可以查看,由于程序中需要知道raw图像的长宽,就使用ps,把raw文件拖进ps看他的长宽和位深,必要的时候进行一下长宽互换。
#include
#include
#include
#include
using namespace std;
using namespace cv;
int createBmpFromRaw()
{
char *rawFileName = "/nfs/QI_test/QI_TEST.raw";
FILE *fp = NULL;
int ret = 0;
int width = 4962;
int height = 7015;//这个大小就是我拖进ps里面看到的长宽
//unsigned char pRawData[4962*2800] = { 0 };//不能使用数组来存储,数组会在栈上分配,会报段错误(segment fault)
unsigned char* pRawData=(unsigned char*)malloc(4962*7015*sizeof(unsigned char));//改为malloc在堆上分配内存
if (NULL == pRawData)
{
printf("Fail to calloc pRawData!\n");
return -1;
}
fp = fopen(rawFileName, "rb");
if (NULL == fp)
{
printf("Fail to read %s!\n", rawFileName);
return -1;
}
ret = fread(pRawData, 4962*7015, 1, fp);//把raw数据读到malloc开辟的内存空间
if (1 != ret)
{
printf("Fail to fread data!\n");
return -1;
}
Mat iMat(height,width,CV_8UC1, pRawData);
imwrite("/nfs/QI_test/QI_TEST.bmp", iMat);//这块会自动给bmp文件加上信息头,文件头那些东西,不需要自己写,这就是opencv实现raw到bmp的优点
free(pRawData);//释放malloc开辟的内存
close(fp);
return 0;
}
第一次在linux下执行提示段错误(segment fault),百度了之后说是我申请的数组太大,所以在编译的时候就给我报段错误,所以我把代码里面用数组存储内存改为了用malloc分配内存。然后就成功执行了并转换为bmp文件了。
注:我这段代码只适用位深是8bit的raw图像