我有一组大图像文件,我在Visual Studio 2010中用作Windows上的临时交换文件。我正在编写并根据需要读取文件。
问题是,即使每个文件大小相同,我也会得到不同的文件大小。
所以,我可以这样做:
template <typename T>
std::string PlaceFileOnDisk(T* inImage, const int& inSize)
TCHAR lpTempPathBuffer[MAX_PATH];
TCHAR szTempFileName[MAX_PATH];
DWORD dwRetVal = GetTempPath(MAX_PATH, lpTempPathBuffer);
UINT uRetVal = GetTempFileName(lpTempPathBuffer, TEXT("IMAGE"), 0, szTempFileName);
FILE* fp;
fopen_s(&fp, szTempFileName, "w+");
fwrite(inImage, sizeof(T), inSize, fp);
fclose(fp);
std::string theRealTempFileName(szTempFileName);
return theRealTempFileName;
}
但是这会导致文件大小介于53到65 mb之间(图像为4713 * 5908 * sizeof(无符号短)。
我认为也许'fwrite'对于大文件可能不稳定,所以我把事情搞得一团糟:
template <typename T>
std::string PlaceFileOnDisk(T* inImage, const int& inYSize, const int& inXSize)
TCHAR lpTempPathBuffer[MAX_PATH];
TCHAR szTempFileName[MAX_PATH];
DWORD dwRetVal = GetTempPath(MAX_PATH, lpTempPathBuffer);
UINT uRetVal = GetTempFileName(lpTempPathBuffer, TEXT("IMAGE"), 0, szTempFileName);
int y;
FILE* fp;
for (y = 0; y < inYSize; y++){
fopen_s(&fp, szTempFileName, "a");
fwrite(&(inImage[y*inXSize]), sizeof(T), inXSize, fp);
fclose(fp);
}
std::string theRealTempFileName(szTempFileName);
return theRealTempFileName;
}
同样的事情:保存到磁盘的文件大小可变,而不是预期的大小。
发生了什么事?他们为什么不一样?
读入功能:
template <typename T>
T* RecoverFileFromDisk(const std::string& inFileName, const int& inSize){
T* theBuffer = NULL;
FILE* fp;
try {
theBuffer = new T[inYSize*inXSize];
fopen_s(&fp, inFileName.c_str(), "r");
fread(theBuffer, sizeof(T), inSize, fp);
fclose(fp);
}
catch(...){
if (theBuffer != NULL){
delete [] theBuffer;
theBuffer = NULL;
}
}
return theBuffer;
}
这个功能可能会遇到类似的问题,但我没有那么远,因为我无法通过写作功能。
我确实尝试使用此页面上的读/写信息: http://msdn.microsoft.com/en-us/library/aa363875%28v=vs.85%29.aspx
但那里的建议根本不起作用,所以我选择了我更熟悉的文件功能。不过,这就是我获得临时文件命名约定的地方。
答案 0 :(得分:-1)
您是否可以在图像写完后打开图像?听起来你也难以写它?
您只是在询问为什么相同尺寸的图片的文件大小不同?初始文件的大小如何相互比较?它可能与初始图像文件的压缩方式有关。
我不确定你对这些文件做了什么,但是你考虑过更基本的“复制”功能吗?