Сохранение битмапа - кто короче ?
От: Hollander Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.11.01 16:35
Оценка: 9 (3)
Привет !

Встретил топик похожий, налабал решение попроще. Так можно сохранять хучь битмапы, хучь иконки, хучь метафайлы и вообще все объекты, поддерживающие IPicture. Написал на Cи — так круче.


BOOL SaveBitmap(HBITMAP hBitmap,HPALETTE hPal,LPCTSTR szPath)
{
    PICTDESC pDesc;
    
    pDesc.cbSizeofstruct = sizeof(PICTDESC);
    pDesc.bmp.hbitmap = hBitmap;
    pDesc.bmp.hpal = hPal;
    pDesc.picType =  PICTYPE_BITMAP;

    return SavePictureIndirect(pDesc,szPath);
}

BOOL SavePictureIndirect(PICTDESC pDesc,LPCTSTR szPath)
{
    IPicture* pPicture = NULL;
    BOOL bResult = TRUE;

    OleCreatePictureIndirect(&pDesc,&IID_IPicture,FALSE,(void**)&pPicture);
    if(pPicture == NULL)
        bResult = FALSE;
    else
    {
        pPicture->lpVtbl->AddRef(pPicture);
        bResult = SavePicture(pPicture,szPath);
    }
    if(pPicture != NULL)
        pPicture->lpVtbl->Release(pPicture);
    return bResult;
}

BOOL SavePicture(IPicture* pPicture,LPCTSTR szPath)
{
    IStream* pStream = NULL;
    HGLOBAL hgl = NULL;
    void* lpVoid = NULL; 
    long nSize = 0;
    HRESULT hr = S_OK;
    HANDLE handle = NULL;
    LONG res = 0;
    DWORD err = 0;
    

    if(pPicture == NULL)
        return FALSE;
    
    do
    {
        hgl = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,8192);
        if(hgl == NULL)
            break;
        CreateStreamOnHGlobal(hgl,FALSE,&pStream);
        if(pStream == NULL)
            break;
        pPicture->lpVtbl->put_KeepOriginalFormat(pPicture,TRUE);
        hr = pPicture->lpVtbl->SaveAsFile(pPicture,pStream,TRUE,&nSize);
        if(FAILED(hr))
            break;
        handle = CreateFile(szPath,
            GENERIC_WRITE,
            FILE_SHARE_WRITE,NULL,
            CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL,
            NULL);
        lpVoid = GlobalLock(hgl);
        WriteFile(handle,lpVoid,nSize,&res,NULL);
    }
    while(FALSE);
    if(pPicture != NULL)
        pPicture->lpVtbl->Release(pPicture);
    if(pStream != NULL)
        pStream->lpVtbl->Release(pStream);
    if(hgl != NULL)
    {
        if(lpVoid != NULL)
            GlobalUnlock(hgl);
        GlobalFree(hgl);
    }
    if(handle != NULL)
        CloseHandle(handle);
    return (res != 0) && (res == nSize);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.