苦于手头没有16位的图像,于是想用程序画一个来替代。就是从0开始一直加到65535,看起来是一种由暗渐变到亮的效果。生成的程序很简单
uint16_t i(0),j(0);
ofstream outf("IAmRaw.txt");//输出文件
for (i = 0; i < 512; i++)
{
for (j = 0; j < 512; j++)
{
t = j * 128;
outf << (uchar)t;// &0x00ff);
outf << (uchar)(t >> 8);// &0x00ff);
}
}
outf.close();
读取的程序也不多
FILE *RAWFile;
errno_t err;
char *RAWAddr;
//char unknown[2048];
err = fopen_s(&RAWFile, RAWFlieName, "rb");
if (err == 0)
{
//cout << "The file "<<RAWFlieName<<" was opened"<< endl ;
//fseek(RAWFile, 0, SEEK_END);
int rawFileSize = IMAGECOL*IMAGEROW*2;// ftell(RAWFile);
RAWAddr = new char[rawFileSize];
rewind(RAWFile);
//cout << RAWAddr;
//_fread_nolock(unknown, sizeof(char), 1024, RAWFile);//
if (!rawFileSize == _fread_nolock(RAWAddr, sizeof(char), rawFileSize, RAWFile))
{
fclose(RAWFile);
delete[] RAWAddr;
cout << "读取文件 " << RAWFlieName << " 失败!!" << endl;
return -1;
}
//cout << sizeof(RAWAddr);
//printf("%s", RAWAddr);
if (RAWFile)
{
err = fclose(RAWFile);
if (err != 0)
{
cout << "关闭文件 " << RAWFlieName << " 失败!" << endl;
}
//memset(rawData,0,sizeof(rawData));
for (i = 0; i < IMAGEROW; i++)//reorder gray
{
for (j = 0; j < IMAGECOL; j++)
{
unsigned short pointH = (unsigned short)*(RAWAddr + (i*IMAGECOL + j) * 2 + 1);
rawData[i][j] = (pointH << 8) + (uchar)*(RAWAddr + (i*IMAGECOL + j) * 2);
}
}
delete[] RAWAddr;
但是显示成图像就成了这样
仔细观察每一行不但多出了一个点,在较暗的区域还有一个特别亮的点,仔细分析数据发现原本应该是2560、2688的两个点变成了3328、32778、2573这三个数。调了一晚上,几乎崩溃。简直无解!!!!!
于是我又专门用2560和2688写了一个文件,发现文件很大(相比较从前)。使用Binary viewer软件一看,发现在每一个00与0A、80与0A中间都多出了一个0D。再查看原文件,如图:
这是为什么呢?
查一下ASCii表发现0D是回车键,0A是换行建,而windows使用的换行符为\r\n;windows系统中对于换行\n是自动加上\r的。这样一来就发现了其中的原由。
是在写入文件时出现了0A,window系统认为我输入的是换行\n,于是自动加上了一个\r即0D;于是我原来的编码就乱了套,出现了图中的白线。
对程序作如下修改
if (RAWFile)
{
err = fclose(RAWFile);
if (err != 0)
{
cout << "关闭文件 " << RAWFlieName << " 失败!" << endl;
}
//memset(rawData,0,sizeof(rawData));
rn = RAWAddr;
for (i = 0; i < IMAGEROW; i++)//reorder gray
{
for (j = 0; j < IMAGECOL; j++)
{
if (*(rn+1) == 0x0d && *(rn+2) == 0x0a)
{
rn++;
}
unsigned short pointH = (unsigned short)*(rn+1);
rawData[i][j] = (pointH << 8) + (uchar)*(rn);
rn+=2;
}
}
读回图片如下: