コード例 #1
0
ファイル: ICONS.C プロジェクト: cugxiangzhenwei/MySrcCode
/****************************************************************************
*
*     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;
}
コード例 #2
0
ファイル: IconOperate.cpp プロジェクト: carlosCn/ModifyIcon
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 ;
}
コード例 #3
0
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;
}
コード例 #4
0
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;
}