Send comments on this topic. | Back to Introduction - All Topics | Help Version 15.03.27
LEAD Bitmap Encoder Property Bag: XPS Specific Options
See Also

Provides additional options for the LEAD XPS Bitmap Encoder. XPS stands for the XML Paper Specification.

Property Bag Items

LEAD XPS Encoder Options
Property Name VARTYPE Default Value Applicable LEAD Encoders Description
XResolution VT_I4 96 XPS Horizontal display resolution in dots per inch.
YResolution VT_I4 96 XPS Vertical display resolution in dots per inch.

 

See Also

Example

// This example shows how to save an XPS file with options using the property bag
// Then the file is saved with the following options:
// * XResolution: 300
// * YResolution: 300
// Refer to the Example Requirements for help in running this sample
HRESULT IWICLeadBitmapEncoder_PropertyBag_Xps(HWND hWnd, WCHAR *pszOut)
{
   HRESULT hr = S_OK;
   IWICImagingFactory *piImagingFactory = NULL;
   IWICBitmapEncoder *piBitmapEncoder = NULL;
   IWICBitmapFrameEncode *piBitmapFrameEncode = NULL;
   IWICStream *piStream = NULL;
   IPropertyBag2 *piPropertyBag = NULL;
   CString csExampleName;
   GUID guidContainerFormat = GUID_ContainerFormatLeadXps;
   WICPixelFormatGUID guidPixelFormat = GUID_WICPixelFormat24bppBGR;

   csExampleName.Format(L"IWICLeadBitmapEncoder_PropertyBag_Xps\nThis example creates an Xps file (%s) with XResolution 300, and YResolution 300", pszOut);

   // Create a LEAD Jpeg Bitmap Encoder
   IFS(CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, (LPVOID*) &piImagingFactory));

   IFS(piImagingFactory->CreateStream(&piStream));
   IFS(piStream->InitializeFromFilename(pszOut, GENERIC_WRITE));
   IFS(piImagingFactory->CreateEncoder(guidContainerFormat, NULL, &piBitmapEncoder));
   IFS(piBitmapEncoder->Initialize(piStream, WICBitmapEncoderNoCache));
   IFS(piBitmapEncoder->CreateNewFrame(&piBitmapFrameEncode, &piPropertyBag));

   // This is how you customize the a LEAD WIC Encoder property bag.
   if(SUCCEEDED(hr))
   {        
      ULONG uCount = 0;
      hr = piPropertyBag->CountProperties(&uCount);
      PROPBAG2 *pBag = new PROPBAG2[uCount];
      ZeroMemory(pBag, sizeof(*pBag));

      VARIANT *pValue = new VARIANT[uCount];
      ZeroMemory(pValue, sizeof(*pValue));

      HRESULT *pErrors = new HRESULT[uCount];
      ZeroMemory(pErrors, sizeof(*pErrors));

      IFS(piPropertyBag->GetPropertyInfo(0, uCount, pBag, &uCount));
      IFS(piPropertyBag->Read(uCount, pBag, NULL, pValue, pErrors));
      if (SUCCEEDED(hr))
      {
         for (ULONG u = 0; u < uCount; u++)
         {
            if (wcscmp(pBag[u].pstrName, L"XResolution")== 0)
            {
               pValue[u].uintVal = 300;
               piPropertyBag->Write(1, pBag+u, pValue+u);
            }
            if (wcscmp(pBag[u].pstrName, L"YResolution")== 0)
            {
               pValue[u].uintVal = 300;
               piPropertyBag->Write(1, pBag+u, pValue+u);
            }
        }
      }
      //Cleanup
      DELETE_POINTER(pBag);
      DELETE_POINTER(pValue);
      DELETE_POINTER(pErrors);

      IFS(piBitmapFrameEncode->Initialize(piPropertyBag));
   }

   // Now create the image data that we will write
   UINT uiWidth = 256;
   UINT uiHeight = 256;
   IFS(piBitmapFrameEncode->SetSize(uiWidth, uiHeight));
   WICPixelFormatGUID formatGUID = GUID_WICPixelFormat24bppBGR;
   IFS(piBitmapFrameEncode->SetPixelFormat(&formatGUID));

   if (SUCCEEDED(hr))
   {
      // We're expecting to write out 24bppRGB. Fail if the encoder cannot do it.
      hr = IsEqualGUID(formatGUID, GUID_WICPixelFormat24bppBGR) ? S_OK : E_FAIL;
   }

   if (SUCCEEDED(hr))
   {
      UINT cbStride = (uiWidth * 24 + 7)/8;
      UINT cbBufferSize = uiHeight * cbStride;
      BYTE *pbBuffer = new BYTE[cbBufferSize];

      if (pbBuffer != NULL)
      {
         for (UINT i = 0; i < cbBufferSize; i++)
         {
            pbBuffer[i] = static_cast<BYTE>(rand());
         }
         hr = piBitmapFrameEncode->WritePixels(uiHeight, cbStride, cbBufferSize, pbBuffer);
         delete[] pbBuffer;
      }
      else
      {
         hr = E_OUTOFMEMORY;
      }
   }

   // Commit the changes to the stream
   IFS(piBitmapFrameEncode->Commit());   
   IFS(piBitmapEncoder->Commit());

   RELEASE_INTERFACE(piBitmapFrameEncode);
   RELEASE_INTERFACE(piBitmapEncoder);
   RELEASE_INTERFACE(piImagingFactory);
   RELEASE_INTERFACE(piPropertyBag);
   RELEASE_INTERFACE(piStream);

   MessageBox(hWnd, csExampleName, csExampleName, MB_OK);
   return hr;
}