Inserire immagini in un file XPS OM
Viene descritto come inserire le immagini in un file XPS OM.
Per inserire immagini in un file XPS OM, creare un oggetto percorso che definisce la posizione e la struttura di un'immagine, quindi usare un pennello immagine per riempire il percorso. Aggiungere l'oggetto percorso creato all'elenco di oggetti visivi della pagina o dell'area di disegno, in modo che possa essere eseguito il rendering con l'altro contenuto visivo.
Prima di usare questi esempi di codice nel programma, leggere la dichiarazione di non responsabilità in Common XPS Document Programming Tasks.
Esempio di codice
Creare una risorsa immagine
Se l'immagine di origine non è disponibile in XPS OM come risorsa immagine, creare prima di tutto la risorsa immagine:
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.
Posizionare l'immagine nella raccolta di oggetti visivi
Se l'immagine di origine è disponibile in XPS OM come risorsa immagine, può essere usata per creare un oggetto pennello immagine e aggiungerla come pennello di riempimento al percorso che descrive la posizione e le dimensioni dell'immagine nella pagina.
// 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();
Creare un oggetto percorso per l'immagine
Il metodo seguente accetta una struttura XPS_RECT e crea un percorso rettangolare.
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;
}
Argomenti correlati
-
passaggi successivi
-
Esplorare la XPS OM
-
scrivere testo in un XPS OM
-
Disegnare grafica in un XPS OM
-
Stampare un XPS OM
-
utilizzato in questa pagina
-
per altre informazioni
-
inizializzare un XPS OM