std::wstring ImageFile::SerializeImage(std::shared_ptr<BYTE>& bytes, int byteCount) {
RPC_WSTR guidAsStr;
WCHAR tempPath[MAX_PATH];
std::wstring retval, tempFile;
std::unique_ptr<GUID> guid(new GUID);
CoCreateGuid(guid.get());
UuidToString(guid.get(), &guidAsStr);
auto str = std::wstring((LPTSTR) guidAsStr);
GetTempPath(MAX_PATH, tempPath);
tempFile = std::wstring(tempPath).append(L"photo_").append(str).append(L".bmp");
auto infoHeader = GetBitmapInfoHeader();
auto fileHeader = GetBitmapFileHeader(infoHeader);
if (SerializeImageHelper(infoHeader, fileHeader, tempFile, bytes, byteCount)) {
if (RotateImage(tempFile, retval))
m_savedImagePath = retval;
} else retval = L"";
return retval;
}
BITMAPINFOHEADER ImageFile::GetBitmapInfoHeader() {
BITMAPINFOHEADER retval = {0};
retval.biSize = sizeof(BITMAPINFOHEADER);
retval.biBitCount = 32;
retval.biPlanes = 1;
retval.biCompression = BI_RGB;
retval.biWidth = 640;
retval.biHeight = 480;
retval.biSizeImage = ((((retval.biWidth * retval.biBitCount) + 31) & ~31) >> 3) * retval.biHeight;
return retval;
}
BITMAPFILEHEADER ImageFile::GetBitmapFileHeader(const BITMAPINFOHEADER& infoHeader) {
BITMAPFILEHEADER retval = {0};
auto nBitsOffset = sizeof(BITMAPFILEHEADER) + infoHeader.biSize;
auto lImageSize = infoHeader.biSizeImage;
auto lFileSize = nBitsOffset + lImageSize;
retval.bfType = 'B'+('M'<<8);
retval.bfOffBits = nBitsOffset;
retval.bfSize = lFileSize;
return retval;
}
bool ImageFile::SerializeImageHelper(const BITMAPINFOHEADER& infoHeader, const BITMAPFILEHEADER& fileHeader,
std::wstring& filePath, std::shared_ptr<BYTE>& bytes, int byteCount) {
auto retval = false;
auto hFile = CreateFile(filePath.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
auto newFile = CFile(hFile);
newFile.Write(&fileHeader, sizeof(BITMAPFILEHEADER));
newFile.Write(&infoHeader, sizeof(BITMAPINFOHEADER));
newFile.Write(bytes.get(), byteCount);
newFile.Close();
retval = true;
}
return retval;
}