严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C2661 “ATL::CImage::Save”: 没有重载函数接受 4 个参数 PhotoAPP C:\Users\15681962099\Desktop\PhotoAPP\PhotoAPP\CImageproc.cpp 6132
时间: 2023-06-30 12:18:31 浏览: 239
ATLVC源代码:tlbrowser
这个错误是因为 CImage::Save 函数没有重载接受 4 个参数的版本。CImage::Save 函数只有两个重载版本,它们分别接受一个文件名和一个 IStream 对象作为参数。因此,您需要修改您的代码,将第四个参数 pal 改为一个 IStream 对象,或者使用另一个函数来保存图片。
如果您想要使用 IStream 对象来保存图片,可以使用 CImage::Save 函数的第二个重载版本,它接受一个 IStream 对象作为参数。示例代码如下:
```
IStream* pStream = SHCreateMemStream(NULL, 0);
if (pStream != NULL)
{
// 将图像保存为 BMP 格式到内存流中
bmp.Save(pStream, Gdiplus::ImageFormatBMP);
// 将内存流中的数据保存到文件中
HGLOBAL hMem = NULL;
GetHGlobalFromStream(pStream, &hMem);
LPVOID pData = GlobalLock(hMem);
DWORD dwSize = GlobalSize(hMem);
HANDLE hFile = CreateFile(_T("sun.bmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwBytesWritten = 0;
WriteFile(hFile, pData, dwSize, &dwBytesWritten, NULL);
CloseHandle(hFile);
GlobalUnlock(hMem);
pStream->Release();
}
```
如果您想要使用另一个函数来保存图片,可以使用 Gdiplus::Bitmap::Save 函数,它接受一个文件名、一个 ImageCodecInfo 对象和一个 EncoderParameters 对象作为参数。示例代码如下:
```
CLSID clsid;
GetEncoderClsid(_T("image/bmp"), &clsid);
EncoderParameters encoderParams;
encoderParams.Count = 0;
bmp.Save(_T("sun.bmp"), &clsid, &encoderParams);
```
其中,GetEncoderClsid 函数用来获取 BMP 格式的编码器的 CLSID,示例代码如下:
```
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0, size = 0;
GetImageEncodersSize(&num, &size);
if (size == 0) return -1;
ImageCodecInfo* pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if (pImageCodecInfo == NULL) return -1;
GetImageEncoders(num, size, pImageCodecInfo);
for (UINT i = 0; i < num; ++i)
{
if (wcscmp(pImageCodecInfo[i].MimeType, format) == 0)
{
*pClsid = pImageCodecInfo[i].Clsid;
free(pImageCodecInfo);
return i;
}
}
free(pImageCodecInfo);
return -1;
}
```
请注意,以上示例代码仅供参考,您需要根据自己的具体情况进行修改。
阅读全文