Размещение изображений в OM XPS
Описание размещения изображений в OM XPS.
Чтобы разместить изображения в OM XPS, создайте объект пути, определяющий расположение и контур изображения, а затем используйте кисть изображения для заполнения пути. Добавьте созданный объект пути в список визуальных объектов страницы или холста, чтобы его можно было отобразить с помощью другого визуального содержимого.
Прежде чем использовать эти примеры кода в программе, прочтите заявление об отказе в задачах программирования документов Common XPS.
Пример кода
Создание ресурса образа
Если исходный образ недоступен в OM XPS в качестве ресурса образа, сначала создайте ресурс образа:
HRESULT hr = S_OK;
IStreamPtr imageStream; // the resulting image stream
IOpcPartUri *imagePartUri;
IXpsOMImageResource *imageResource;
XPS_RECT rect = {0.0f, 0.0f, 0.0f, 0.0f}; // set to image size
hr = xpsFactory->CreateReadOnlyStreamOnFile (
imageFileName, &imageStream );
hr = xpsFactory->CreatePartUri( imagePartName, &imagePartUri );
imageType; // set to type of image being read in
hr = xpsFactory->CreateImageResource (
imageStream,
imageType,
imagePartUri,
&imageResource);
imagePartUri->Release();
imageStream->Release();
// imageResource can now be used by other parts in the XPS OM.
Размещение изображения в визуальной коллекции
Если исходный образ доступен в OM XPS в качестве ресурса изображения, его можно использовать для создания объекта кисти изображения и добавления в качестве кисти заливки в путь, описывающий расположение изображения и размер страницы.
// These variables are initialized outside of this code example,
// for example, as the parameters of a method or from some
// preceding program code.
// dimensions of the image in pixels
XPS_SIZE bmpDim = {0,0} ;
// DPI resolution values obtained from image
FLOAT dpiX = 96.0f;
FLOAT dpiY = 96.0f;
// initialize viewport values
XPS_RECT viewPort = {0.0,0.0,0.0,0.0};
// initialize viewbox values
XPS_RECT viewBox = {0.0,0.0,0.0,0.0};
// These are part of this code example.
IXpsOMPath *imageRectPath;
IXpsOMImageBrush *imageBrush;
IXpsOMVisualCollection *pageVisuals;
// Describe image source dimensions and set viewbox to be the
// entire image DIP width of image.
// Example:
// 600 image pixels, 300 dpi -> 2 inches -> 2 * 96 = 192 DIP width
viewBox.width = FLOAT((double)bmpDim.width * 96.0 / dpiX);
viewBox.height = FLOAT((double)bmpDim.height * 96.0 / dpiY);
// Describe the size and position of the image destination.
// rect is an XPS_RECT structure that is initialized outside
// of this sample for example, it might be passed in as a parameter.
// destination rectangle
viewPort.x = rect.x;
viewPort.y = rect.y;
viewPort.width = rect.width;
viewPort.height = rect.height;
// Create the image brush.
hr = xpsFactory->CreateImageBrush(imageResource, &viewBox, &viewPort,
reinterpret_cast<IXpsOMImageBrush**>(&imageBrush));
// Create the path that describes the outline of the image on the page.
// This step uses the function described in the next code example.
hr = CreateRectanglePath(xpsFactory, &rect,
reinterpret_cast<IXpsOMPath**>(&imageRectPath));
// Set the accessibility description for the path object as required.
hr = imageRectPath->SetAccessibilityShortDescription( shortDescText );
// Set the image brush to be the fill brush for this path.
hr = imageRectPath->SetFillBrushLocal( imageBrush );
// Get the list of visuals for this page...
hr = xpsPage->GetVisuals( &pageVisuals );
// ...and add the completed path to the list.
hr = pageVisuals->Append( imageRectPath );
// Release locally created interfaces.
if (NULL != pageVisuals) pageVisuals->Release();
if (NULL != imageRectPath) imageRectPath->Release();
if (NULL != imageBrush) imageBrush->Release();
Создание объекта пути для изображения
Следующий метод принимает структуру XPS_RECT и создает прямоугольный путь.
HRESULT
CreateRectanglePath(
__in IXpsOMObjectFactory *xpsFactory,
__in const XPS_RECT *rect,
__out IXpsOMPath **rectPath
)
{
HRESULT hr = S_OK;
IXpsOMGeometryFigure *rectFigure;
IXpsOMGeometry *imageRectGeometry;
IXpsOMGeometryFigureCollection *geomFigureCollection;
// Define start point and three of the four sides of the rectangle.
// The fourth side is implied by setting the path type to CLOSED.
XPS_POINT startPoint = {rect->x, rect->y};
XPS_SEGMENT_TYPE segmentTypes[3] = {
XPS_SEGMENT_TYPE_LINE,
XPS_SEGMENT_TYPE_LINE,
XPS_SEGMENT_TYPE_LINE
};
FLOAT segmentData[6] = {
rect->x, rect->y+rect->height,
rect->x+rect->width, rect->y+rect->height,
rect->x+rect->width, rect->y
};
BOOL segmentStrokes[3] = {
TRUE, TRUE, TRUE
};
// Create a closed geometry figure using the three
// segments defined above.
hr = xpsFactory->CreateGeometryFigure( &startPoint, &rectFigure );
hr = rectFigure->SetIsClosed( TRUE );
hr = rectFigure->SetIsFilled( TRUE );
hr = rectFigure->SetSegments( 3, 6,
segmentTypes, segmentData, segmentStrokes );
// Create a geometry that consists of the figure created above.
hr = xpsFactory->CreateGeometry( &imageRectGeometry );
hr = imageRectGeometry->GetFigures( &geomFigureCollection );
hr = geomFigureCollection->Append( rectFigure );
// Create the path that consists of the geometry created above
// and return the pointer in the parameter passed in to the function.
hr = xpsFactory->CreatePath( reinterpret_cast<IXpsOMPath**>(rectPath) );
hr = (*rectPath)->SetGeometryLocal( imageRectGeometry );
// The calling method will release these interfaces when
// it is done with them.
return hr;
}
См. также
-
Дальнейшие действия
-
Используется на этой странице
-
Дополнительные сведения