2013-01-10 8 views
1

비트 맵을 파일로 저장하는 데 문제가 있습니다. 나는 참조로 How to save ID2D1Bitmap to PNG file을 사용하고 있지만, 나는 그것에 게시 된 것보다 다른 오류가 있습니다.WIC를 사용하여 ID2D1Bitmap을 파일에 저장하는 방법은 무엇입니까?

다음과 같은 오류 메시지가 나타납니다. 0x88990015 HRESULT : 사용 된 리소스가 다른 리소스 도메인의 렌더링 대상에 의해 생성되었습니다.

여기 내 코드입니다 :

void Wnd::SavePng(LPCWSTR Path,ID2D1Bitmap* pBit) { 
    CComPtr<ID2D1RenderTarget> pRT; 
    CComPtr<IWICBitmap> pB; 
    CComPtr<IWICBitmapEncoder> pEncoder; 
    CComPtr<IWICBitmapFrameEncode> pFrame; 
    CComPtr<IWICStream> pStream; 

    WICPixelFormatGUID format = GUID_WICPixelFormat32bppPBGRA; 
    HRESULT Hr = m_pWICFactory->CreateBitmap(pBit->GetSize().width,pBit->GetSize().height,format,WICBitmapCacheOnLoad,&pB); 

    if (SUCCEEDED(Hr)) { 
     D2D1_RENDER_TARGET_PROPERTIES RTProps = RenderTargetProperties(); 
     RTProps.pixelFormat = PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,D2D1_ALPHA_MODE_PREMULTIPLIED); 
     Hr = m_pDirect2dFactory->CreateWicBitmapRenderTarget(pB,&RTProps,&pRT); 
    } 

    if (SUCCEEDED(Hr)) { 
     pRT->BeginDraw(); 
     pRT->Clear(); 
     pRT->DrawBitmap(pBit); 
     Hr = pRT->EndDraw(); 
    } 

    if (SUCCEEDED(Hr)) { 
     Hr = m_pWICFactory->CreateStream(&pStream); 
    } 

    if (SUCCEEDED(Hr)) { 
     Hr = pStream->InitializeFromFilename(Path,GENERIC_WRITE); 
    } 

    if (SUCCEEDED(Hr)) { 
     Hr = m_pWICFactory->CreateEncoder(GUID_ContainerFormatPng,NULL,&pEncoder); 
    } 

    if (SUCCEEDED(Hr)) { 
     Hr = pEncoder->Initialize(pStream,WICBitmapEncoderNoCache); 
    } 

    if (SUCCEEDED(Hr)) { 
     Hr = pEncoder->CreateNewFrame(&pFrame,NULL); 
    } 

    if (SUCCEEDED(Hr)) { 
     Hr = pFrame->Initialize(NULL); 
    } 

    if (SUCCEEDED(Hr)) { 
     Hr = pFrame->SetSize(pBit->GetSize().width,pBit->GetSize().height); 
    } 

    if (SUCCEEDED(Hr)) { 
     Hr = pFrame->SetPixelFormat(&format); 
    } 

    if (SUCCEEDED(Hr)) { 
     Hr = pFrame->WriteSource(pB,NULL); 
    } 

    if (SUCCEEDED(Hr)) { 
     Hr = pFrame->Commit(); 
    } 

    if (SUCCEEDED(Hr)) { 
     Hr = pEncoder->Commit(); 
    } 
} 

당신이 서로 다른 공장에 의해 만들어 자원을 사용할 수 없다는 것을 이해하지만,이 일을 할 수있는 방법이 있어야한다.

답변

1

자원 친 화성에 대한 이해가 부족합니다. 리소스는 공장 고유가 아닌 디바이스마다 다릅니다. 그렇습니다. 그들은 공장 고유의 경향이 있지만, 핵심은 장치의 특수성입니다.

예를 들어, 다른 렌더링 대상에서 만든 비트 맵을 전달하는 경우 다른 렌더링 대상의 DrawBitmap 메서드로 전달합니다. 같은 렌더 타겟으로 생성 된 비트 맵 만 그릴 수 있습니다. 이렇게하면 비트 맵과 렌더링 대상 (소스 및 대상)이 동일한 자원 도메인 (주소 공간)에 있는지 확인할 수 있습니다.