Trabajar con imágenes

Aspose.Words permite a los usuarios trabajar con imágenes de una forma muy flexible. En este artículo, puedes explorar sólo algunas de las posibilidades de trabajar con imágenes.

Cómo insertar una imagen

DocumentBuilder proporciona varias sobrecargas del método InsertImage que le permiten insertar una imagen en línea o flotante. Si la imagen es un metarchivo EMF o WMF, se insertará en el documento en formato de metarchivo. Todas las demás imágenes se almacenarán en formato PNG. El método InsertImage puede utilizar imágenes de diferentes fuentes:

  • Desde un archivo o URL pasando un parámetro String InsertImage
  • Desde una secuencia pasando un parámetro Stream InsertImage
  • Desde un objeto Imagen pasando un parámetro Imagen InsertImage
  • Desde una matriz de bytes pasando un parámetro de matriz de bytes InsertImage

Para cada uno de los métodos InsertImage, existen más sobrecargas que le permiten insertar una imagen con las siguientes opciones:

  • En línea o flotante en una posición específica, por ejemplo, InsertImage
  • Escala porcentual o tamaño personalizado, por ejemplo, InsertImage; Además, el método InsertImage devuelve un objeto Shape que acaba de crearse e insertarse para que pueda modificar aún más las propiedades de la Forma.

Cómo insertar una imagen {#insert-an-inline-image} en línea

Pase una sola cadena que represente un archivo que contiene la imagen a InsertImage para insertar la imagen en el documento como un gráfico en línea.

El siguiente ejemplo de código muestra cómo insertar una imagen en línea en la posición del cursor en un documento:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.InsertImage(dataDir + "Watermark.png");
dataDir = dataDir + "DocumentBuilderInsertInlineImage_out.doc";
doc.Save(dataDir);

Cómo insertar una imagen flotante

El siguiente ejemplo de código muestra cómo insertar una imagen flotante desde un archivo o URL en una posición y tamaño específicos:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.InsertImage(dataDir + "Watermark.png",
RelativeHorizontalPosition.Margin,
100,
RelativeVerticalPosition.Margin,
100,
200,
100,
WrapType.Square);
dataDir = dataDir + "DocumentBuilderInsertFloatingImage_out.doc";
doc.Save(dataDir);

Cómo extraer imágenes de un documento

Todas las imágenes se almacenan dentro de nodos Shape en un Document. Para extraer todas las imágenes o imágenes que tengan un tipo específico del documento, siga estos pasos:

  • Utilice el método GetChildNodes para seleccionar todos los nodos Shape.
  • Iterar a través de las colecciones de nodos resultantes.
  • Verifique la propiedad booleana HasImage.
  • Extraer datos de imágenes utilizando la propiedad ImageData.
  • Guardar datos de imagen en un archivo.

El siguiente ejemplo de código muestra cómo extraer imágenes de un documento y guardarlas como archivos:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithImages();
Document doc = new Document(dataDir + "Image.SampleImages.doc");
NodeCollection shapes = doc.GetChildNodes(NodeType.Shape, true);
int imageIndex = 0;
foreach (Shape shape in shapes)
{
if (shape.HasImage)
{
string imageFileName = string.Format(
"Image.ExportImages.{0}_out{1}", imageIndex, FileFormatUtil.ImageTypeToExtension(shape.ImageData.ImageType));
shape.ImageData.Save(dataDir + imageFileName);
imageIndex++;
}
}

Cómo insertar un código de barras en cada página del documento

Este ejemplo le muestra cómo agregar códigos de barras iguales o diferentes en todas o en páginas específicas de un documento de Word. No existe una forma directa de agregar códigos de barras en todas las páginas de un documento, pero puede usar los métodos MoveToSection, MoveToHeaderFooter y InsertImage para moverse a cualquier sección o encabezado/pie de página e insertar las imágenes de códigos de barras como puede ver en el siguiente código.

El siguiente ejemplo de código muestra cómo insertar una imagen de código de barras en cada página de un documento:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithImages();
// Create a blank documenet.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// The number of pages the document should have.
int numPages = 4;
// The document starts with one section, insert the barcode into this existing section.
InsertBarcodeIntoFooter(builder, doc.FirstSection, 1, HeaderFooterType.FooterPrimary);
for (int i = 1; i < numPages; i++)
{
// Clone the first section and add it into the end of the document.
Section cloneSection = (Section)doc.FirstSection.Clone(false);
cloneSection.PageSetup.SectionStart = SectionStart.NewPage;
doc.AppendChild(cloneSection);
// Insert the barcode and other information into the footer of the section.
InsertBarcodeIntoFooter(builder, cloneSection, i, HeaderFooterType.FooterPrimary);
}
dataDir = dataDir + "Document_out.docx";
// Save the document as a PDF to disk. You can also save this directly to a stream.
doc.Save(dataDir);
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
private static void InsertBarcodeIntoFooter(DocumentBuilder builder, Section section, int pageId, HeaderFooterType footerType)
{
// Move to the footer type in the specific section.
builder.MoveToSection(section.Document.IndexOf(section));
builder.MoveToHeaderFooter(footerType);
// Insert the barcode, then move to the next line and insert the ID along with the page number.
// Use pageId if you need to insert a different barcode on each page. 0 = First page, 1 = Second page etc.
builder.InsertImage(System.Drawing.Image.FromFile( RunExamples.GetDataDir_WorkingWithImages() + "Barcode1.png"));
builder.Writeln();
builder.Write("1234567890");
builder.InsertField("PAGE");
// Create a right aligned tab at the right margin.
double tabPos = section.PageSetup.PageWidth - section.PageSetup.RightMargin - section.PageSetup.LeftMargin;
builder.CurrentParagraph.ParagraphFormat.TabStops.Add(new TabStop(tabPos, TabAlignment.Right, TabLeader.None));
// Move to the right hand side of the page and insert the page and page total.
builder.Write(ControlChar.Tab);
builder.InsertField("PAGE");
builder.Write(" of ");
builder.InsertField("NUMPAGES");
}

Bloquear relación de aspecto de imagen

La relación de aspecto de una forma geométrica es la relación de sus tamaños en diferentes dimensiones. Puede bloquear la relación de aspecto de la imagen usando AspectRatioLocked. El valor predeterminado de la relación de aspecto de la forma depende del ShapeType. Es true para ShapeType.Image y false para otros tipos de formas.

El siguiente ejemplo de código muestra cómo trabajar con la relación de aspecto:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
var shape = builder.InsertImage(dataDir + "Test.png");
shape.AspectRatioLocked = false;
dataDir = dataDir + "Shape_AspectRatioLocked_out.doc";
// Save the document to disk.
doc.Save(dataDir);

Cómo obtener límites reales de forma en puntos

Si desea que el cuadro delimitador real de la forma se represente en la página, puede lograrlo utilizando la propiedad BoundsInPoints.

El siguiente ejemplo de código muestra cómo utilizar esta propiedad:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
var shape = builder.InsertImage(dataDir + "Test.png");
shape.AspectRatioLocked = false;
Console.Write("\nGets the actual bounds of the shape in points.");
Console.WriteLine(shape.GetShapeRenderer().BoundsInPoints);

Recortar imágenes

El recorte de una imagen generalmente se refiere a la eliminación de las partes exteriores no deseadas de una imagen para ayudar a mejorar el encuadre. También se utiliza para eliminar algunas partes de una imagen para aumentar el enfoque en un área particular.

El siguiente ejemplo de código muestra cómo lograr esto usando Aspose.Words API:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithImages();
string inputPath = dataDir + "ch63_Fig0013.jpg";
string outputPath = dataDir + "cropped-1.jpg";
CropImage(inputPath,outputPath, 124, 90, 570, 571);
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
public static void CropImage(string inPath, string outPath, int left, int top,int width, int height)
{
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Image img = Image.FromFile(inPath);
int effectiveWidth = img.Width - width;
int effectiveHeight = img.Height - height;
Shape croppedImage = builder.InsertImage(img,
ConvertUtil.PixelToPoint(img.Width - effectiveWidth),
ConvertUtil.PixelToPoint(img.Height - effectiveHeight));
double widthRatio = croppedImage.Width / ConvertUtil.PixelToPoint(img.Width);
double heightRatio = croppedImage.Height / ConvertUtil.PixelToPoint(img.Height);
if (widthRatio< 1)
croppedImage.ImageData.CropRight = 1 - widthRatio;
if (heightRatio< 1)
croppedImage.ImageData.CropBottom = 1 - heightRatio;
float leftToWidth = (float)left / img.Width;
float topToHeight = (float)top / img.Height;
croppedImage.ImageData.CropLeft = leftToWidth;
croppedImage.ImageData.CropRight = croppedImage.ImageData.CropRight - leftToWidth;
croppedImage.ImageData.CropTop = topToHeight;
croppedImage.ImageData.CropBottom = croppedImage.ImageData.CropBottom - topToHeight;
croppedImage.GetShapeRenderer().Save(outPath, new ImageSaveOptions(SaveFormat.Jpeg));
}

Guardar imágenes como WMF

Aspose.Words proporciona funcionalidad para guardar todas las imágenes disponibles en un documento en formato WMF mientras convierte DOCX a RTF.

El siguiente ejemplo de código muestra cómo guardar imágenes como WMF con opciones de guardado RTF:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
string fileName = "TestFile.doc";
Document doc = new Document(dataDir + fileName);
RtfSaveOptions saveOpts = new RtfSaveOptions();
saveOpts.SaveImagesAsWmf = true;
doc.Save(dataDir + "output.rtf", saveOpts);