/**************************************************************************** * * FUNCTION: WriteIconToICOFile * * PURPOSE: Writes the icon resource data to an ICO file * * PARAMS: LPICONRESOURCE lpIR - pointer to icon resource * LPCTSTR szFileName - name for the ICO file * * RETURNS: BOOL - TRUE for success, FALSE for failure * * History: * July '95 - Created * \****************************************************************************/ BOOL WriteIconToICOFile( LPICONRESOURCE lpIR, LPCTSTR szFileName ) { HANDLE hFile; UINT i; DWORD dwBytesWritten; // open the file if( (hFile = CreateFile( szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL )) == INVALID_HANDLE_VALUE ) { MessageBox( hWndMain, "Error Opening File for Writing", szFileName, MB_OK ); return FALSE; } // Write the header if( ! WriteICOHeader( hFile, lpIR->nNumImages ) ) { MessageBox( hWndMain, "Error Writing ICO File", szFileName, MB_OK ); CloseHandle( hFile ); return FALSE; } // Write the ICONDIRENTRY's for( i=0; i<lpIR->nNumImages; i++ ) { ICONDIRENTRY ide; // Convert internal format to ICONDIRENTRY ide.bWidth = lpIR->IconImages[i].Width; ide.bHeight = lpIR->IconImages[i].Height; ide.bReserved = 0; ide.wPlanes = lpIR->IconImages[i].lpbi->bmiHeader.biPlanes; ide.wBitCount = lpIR->IconImages[i].lpbi->bmiHeader.biBitCount; if( (ide.wPlanes * ide.wBitCount) >= 8 ) ide.bColorCount = 0; else ide.bColorCount = 1 << (ide.wPlanes * ide.wBitCount); ide.dwBytesInRes = lpIR->IconImages[i].dwNumBytes; ide.dwImageOffset = CalculateImageOffset( lpIR, i ); // Write the ICONDIRENTRY out to disk if( ! WriteFile( hFile, &ide, sizeof( ICONDIRENTRY ), &dwBytesWritten, NULL ) ) return FALSE; // Did we write a full ICONDIRENTRY ? if( dwBytesWritten != sizeof( ICONDIRENTRY ) ) return FALSE; } // Write the image bits for each image for( i=0; i<lpIR->nNumImages; i++ ) { DWORD dwTemp = lpIR->IconImages[i].lpbi->bmiHeader.biSizeImage; // Set the sizeimage member to zero lpIR->IconImages[i].lpbi->bmiHeader.biSizeImage = 0; // Write the image bits to file if( ! WriteFile( hFile, lpIR->IconImages[i].lpBits, lpIR->IconImages[i].dwNumBytes, &dwBytesWritten, NULL ) ) return FALSE; if( dwBytesWritten != lpIR->IconImages[i].dwNumBytes ) return FALSE; // set it back lpIR->IconImages[i].lpbi->bmiHeader.biSizeImage = dwTemp; } CloseHandle( hFile ); return FALSE; }
bool CIconOperate::SaveIcon(const string _str) { if (m_IconDir == NULL || m_IconData == NULL) return false ; //int width = 64 ; //int heigth = 64 ; //int ppx = 32 ; fstream fout; fout.open(_str.c_str(),ios_base::out | ios_base::binary); //reserved WORD wData = 0 ; fout.write((char*)(&wData),sizeof(WORD)); //type wData = 1 ; fout.write((char*)(&wData),sizeof(WORD)); //num wData = m_IconDir->idCount ; fout.write((char*)(&wData),sizeof(WORD)); //write ICONDIRENTRY数据 for (int i = 0 ; i < m_IconDir->idCount ; ++i) { //ICONDIRENTRY结构 ICONDIRENTRY iconData ; iconData.bwidth = m_IconDir->idEntries[i].bwidth ; iconData.bheight = m_IconDir->idEntries[i].bheight ; iconData.bcolorcount = 0; iconData.breserved = 0 ; iconData.wplanes = 1 ; iconData.wbitcount = m_IconDir->idEntries[i].wbitcount ; iconData.dwbytesinres = sizeof(BITMAPINFOHEADER) + iconData.bheight * WIDTHBYTES(iconData.bwidth,iconData.wbitcount) + iconData.bheight * WIDTHBYTES(iconData.bwidth,1); iconData.dwimageoffset = CalculateImageOffset(i) ; fout.write((char*)(&iconData),sizeof(ICONDIRENTRY)); } for (int i = 0 ; i < m_IconDir->idCount ; ++i) { //BITMAPINFOHEADER结构 BITMAPINFOHEADER tBitHeader; tBitHeader.biSize = sizeof(BITMAPINFOHEADER); tBitHeader.biWidth = m_IconDir->idEntries[i].bwidth ; tBitHeader.biHeight = m_IconDir->idEntries[i].bheight*2 ; tBitHeader.biPlanes = 1 ; tBitHeader.biBitCount = m_IconDir->idEntries[i].wbitcount ; tBitHeader.biCompression = 0 ; tBitHeader.biSizeImage = 0; tBitHeader.biXPelsPerMeter = 0 ; tBitHeader.biYPelsPerMeter = 0 ; tBitHeader.biClrUsed = 0 ; tBitHeader.biClrImportant = 0 ; fout.write((char*)(&tBitHeader),sizeof(BITMAPINFOHEADER)); fout.write((char*)m_IconData->data[i].icxor,tBitHeader.biHeight/2 * WIDTHBYTES(tBitHeader.biWidth,tBitHeader.biBitCount)); fout.write((char*)m_IconData->data[i].icand,tBitHeader.biHeight/2 * WIDTHBYTES(tBitHeader.biWidth,1)); } fout.close(); return true ; }
DWORD CIconExtractor::WriteIconToICOFile(LPICONRESOURCE lpIR, LPCTSTR szFileName) { DWORD dwBytesWritten = 0; CAutoFile hFile = CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // open the file if (!hFile) return GetLastError(); // Write the header if (WriteICOHeader(hFile, lpIR->nNumImages)) return GetLastError(); // Write the ICONDIRENTRY's for (UINT i = 0; i < lpIR->nNumImages; ++i) { ICONDIRENTRY ide; // Convert internal format to ICONDIRENTRY ide.bWidth = (BYTE)lpIR->IconImages[i].Width; ide.bHeight = (BYTE)lpIR->IconImages[i].Height; ide.bReserved = 0; ide.wPlanes = lpIR->IconImages[i].lpbi->bmiHeader.biPlanes; ide.wBitCount = lpIR->IconImages[i].lpbi->bmiHeader.biBitCount; if ((ide.wPlanes * ide.wBitCount) >= 8) ide.bColorCount = 0; else ide.bColorCount = 1 << (ide.wPlanes * ide.wBitCount); ide.dwBytesInRes = lpIR->IconImages[i].dwNumBytes; ide.dwImageOffset = CalculateImageOffset( lpIR, i ); // Write the ICONDIRENTRY to disk if (!WriteFile(hFile, &ide, sizeof(ICONDIRENTRY), &dwBytesWritten, NULL)) return GetLastError(); if (dwBytesWritten != sizeof(ICONDIRENTRY)) return GetLastError(); } // Write the image bits for each image for (UINT i = 0; i < lpIR->nNumImages; ++i) { DWORD dwTemp = lpIR->IconImages[i].lpbi->bmiHeader.biSizeImage; bool bError = false; // fix size even on error // Set the sizeimage member to zero lpIR->IconImages[i].lpbi->bmiHeader.biSizeImage = 0; if (!WriteFile( hFile, lpIR->IconImages[i].lpBits, lpIR->IconImages[i].dwNumBytes, &dwBytesWritten, NULL)) bError = true; if (dwBytesWritten != lpIR->IconImages[i].dwNumBytes) bError = true; // set it back lpIR->IconImages[i].lpbi->bmiHeader.biSizeImage = dwTemp; if (bError) return GetLastError(); } return NO_ERROR; }
DWORD CIconExtractor::WriteIconToICOFile(LPICONRESOURCE lpIR, LPCTSTR szFileName) { CAutoFile hFile = ::CreateFile(szFileName, GENERIC_WRITE, FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); // open the file if (!hFile) return GetLastError(); // Write the header if (WriteICOHeader(hFile, lpIR->nNumImages)) return GetLastError(); // Write the ICONDIRENTRY's for (UINT i = 0; i < lpIR->nNumImages; ++i) { ICONDIRENTRY ide = { 0 }; // Convert internal format to ICONDIRENTRY ide.bWidth = static_cast<BYTE>(lpIR->IconImages[i].Width); ide.bHeight = static_cast<BYTE>(lpIR->IconImages[i].Height); if (ide.bHeight == 0) // 256x256 icon, both width and height must be 0 ide.bWidth = 0; ide.bReserved = 0; ide.wPlanes = lpIR->IconImages[i].lpbi->bmiHeader.biPlanes; ide.wBitCount = lpIR->IconImages[i].lpbi->bmiHeader.biBitCount; if ((ide.wPlanes * ide.wBitCount) >= 8) ide.bColorCount = 0; else ide.bColorCount = 1 << (ide.wPlanes * ide.wBitCount); ide.dwBytesInRes = lpIR->IconImages[i].dwNumBytes; ide.dwImageOffset = CalculateImageOffset(lpIR, i); // Write the ICONDIRENTRY to disk DWORD dwBytesWritten = 0; if (!WriteFile(hFile, &ide, sizeof(ICONDIRENTRY), &dwBytesWritten, nullptr)) return GetLastError(); if (dwBytesWritten != sizeof(ICONDIRENTRY)) return GetLastError(); } // Write the image bits for each image for (UINT i = 0; i < lpIR->nNumImages; ++i) { DWORD dwTemp = lpIR->IconImages[i].lpbi->bmiHeader.biSizeImage; bool bError = false; // fix size even on error // Set the sizeimage member to zero, but not if the icon is PNG if (lpIR->IconImages[i].lpbi->bmiHeader.biCompression != 65536) lpIR->IconImages[i].lpbi->bmiHeader.biSizeImage = 0; DWORD dwBytesWritten = 0; if (!WriteFile(hFile, lpIR->IconImages[i].lpBits, lpIR->IconImages[i].dwNumBytes, &dwBytesWritten, nullptr)) bError = true; if (dwBytesWritten != lpIR->IconImages[i].dwNumBytes) bError = true; // set it back lpIR->IconImages[i].lpbi->bmiHeader.biSizeImage = dwTemp; if (bError) return GetLastError(); } return NO_ERROR; }