Optimizar la gestión de imágenes en presentaciones en Android

Imágenes en diapositivas de presentación

Las imágenes hacen que las presentaciones sean más atractivas e interesantes. En Microsoft PowerPoint, puedes insertar imágenes desde un archivo, internet u otras ubicaciones en las diapositivas. De forma similar, Aspose.Slides te permite añadir imágenes a las diapositivas de tus presentaciones a través de diferentes procedimientos.

Aspose.Slides admite operaciones con imágenes en estos formatos populares: JPEG, PNG, GIF y otros.

Agregar imágenes almacenadas localmente a diapositivas

Puedes agregar una o varias imágenes de tu ordenador a una diapositiva de una presentación. Este ejemplo de código en Java muestra cómo añadir una imagen a una diapositiva:

Presentation pres = new Presentation();
try {
	ISlide slide = pres.getSlides().get_Item(0);
	    IPPImage picture;
        IImage image = Images.fromFile("image.png");
        try {
            picture = pres.getImages().addImage(image);
        } finally {
            if (image != null) image.dispose();
        }
	slide.getShapes().addPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, picture);

	pres.save("pres.pptx", SaveFormat.Pptx);
} finally {
	if (pres != null) pres.dispose();
}

Agregar imágenes desde la web a diapositivas

Si la imagen que deseas añadir a una diapositiva no está disponible en tu ordenador, puedes insertarla directamente desde la web.

Este ejemplo de código muestra cómo añadir una imagen desde la web a una diapositiva en Java:

Presentation pres = new Presentation();
try {
	ISlide slide = pres.getSlides().get_Item(0);

	URL imageUrl = new URL("[REPLACE WITH URL]");
	URLConnection connection = imageUrl.openConnection();
	InputStream inputStream = connection.getInputStream();

	ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
	try {
		byte[] buffer = new byte[1024];
		int read;

		while ((read = inputStream.read(buffer, 0, buffer.length)) != -1)
			outputStream.write(buffer, 0, read);

		outputStream.flush();

		IPPImage image = pres.getImages().addImage(outputStream.toByteArray());
		slide.getShapes().addPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, image);
	} finally {
		if (inputStream != null) inputStream.close();
		outputStream.close();
	}

	pres.save("pres.pptx", SaveFormat.Pptx);
} catch(IOException e) {
} finally {
	if (pres != null) pres.dispose();
}

Agregar imágenes a los maestros de diapositivas

Un maestro de diapositivas es la diapositiva superior que almacena y controla la información (tema, diseño, etc.) de todas las diapositivas bajo ella. Por lo tanto, cuando agregas una imagen a un maestro de diapositivas, esa imagen aparece en todas las diapositivas que utilizan ese maestro.

Este ejemplo de código en Java muestra cómo añadir una imagen a un maestro de diapositivas:

Presentation pres = new Presentation();
try {
	ISlide slide = pres.getSlides().get_Item(0);
	IMasterSlide masterSlide = slide.getLayoutSlide().getMasterSlide();

    IPPImage picture;
    IImage image = Images.fromFile("image.png");
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) image.dispose();
    }
	masterSlide.getShapes().addPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, picture);

	pres.save("pres.pptx", SaveFormat.Pptx);
} finally {
	if (pres != null) pres.dispose();
}

Agregar imágenes como fondos de diapositivas

Puedes decidir utilizar una foto como fondo para una diapositiva específica o para varias diapositivas. En ese caso, debes consultar Setting Images as Backgrounds for Slides.

Agregar SVG a presentaciones

Puedes añadir o insertar cualquier imagen en una presentación mediante el método addPictureFrame que pertenece a la interfaz IShapeCollection.

Para crear un objeto de imagen basado en un SVG, puedes hacerlo de la siguiente manera:

  1. Crear un objeto SvgImage para insertarlo en ImageShapeCollection
  2. Crear un objeto PPImage a partir de ISvgImage
  3. Crear un objeto PictureFrame usando la interfaz IPPImage

Este ejemplo de código muestra cómo implementar los pasos anteriores para añadir una imagen SVG a una presentación:

// Instanciar la clase Presentation que representa un archivo PPTX
Presentation pres = new Presentation();
try {
    String svgContent = new String(Files.readAllBytes(Paths.get("image.svg")));
    ISvgImage svgImage = new SvgImage(svgContent);
    IPPImage ppImage = pres.getImages().addImage(svgImage);
    pres.getSlides().get_Item(0).getShapes().addPictureFrame(ShapeType.Rectangle, 0, 0, 
			ppImage.getWidth(), ppImage.getHeight(), ppImage);
    pres.save("output.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

Convertir SVG a un conjunto de formas

La conversión de SVG a un conjunto de formas en Aspose.Slides es similar a la funcionalidad de PowerPoint utilizada para trabajar con imágenes SVG:

Menú emergente de PowerPoint

La funcionalidad la proporciona una de las sobrecargas del método addGroupShape de la interfaz IShapeCollection que recibe un objeto ISvgImage como primer argumento.

Este ejemplo de código muestra cómo utilizar el método descrito para convertir un archivo SVG en un conjunto de formas:

// Crear nueva presentación
IPresentation presentation = new Presentation();
try {
    // Leer el contenido del archivo SVG
    byte[] svgContent = Files.readAllBytes(Paths.get("image.svg"));

    // Crear objeto SvgImage
    ISvgImage svgImage = new SvgImage(svgContent);

    // Obtener el tamaño de la diapositiva
    Dimension2D slideSize = presentation.getSlideSize().getSize();

    // Convertir la imagen SVG en un grupo de formas escalándola al tamaño de la diapositiva
    presentation.getSlides().get_Item(0).getShapes().
            addGroupShape(svgImage, 0f, 0f, (float)slideSize.getWidth(), (float)slideSize.getHeight());

    // Guardar la presentación en formato PPTX
    presentation.save("output.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (presentation != null) presentation.dispose();
}

Agregar imágenes como EMF a diapositivas

Aspose.Slides for Android via Java permite generar imágenes EMF a partir de hojas de Excel y añadir esas imágenes como EMF en diapositivas con Aspose.Cells.

Este ejemplo de código muestra cómo realizar la tarea descrita:

Workbook book = new Workbook("chart.xlsx");
Worksheet sheet = book.getWorksheets().get(0);
ImageOrPrintOptions options = new ImageOrPrintOptions();
options.setHorizontalResolution(200);
options.setVerticalResolution(200);
options.setImageType(ImageType.EMF);

//Guardar el libro de trabajo en el flujo
SheetRender sr = new SheetRender(sheet, options);
Presentation pres = new Presentation();
try {
    pres.getSlides().removeAt(0);
    
    String EmfSheetName = "";
    for (int j = 0; j < sr.getPageCount(); j++)
    {
    
        EmfSheetName = "test" + sheet.getName() + " Page" + (j + 1) + ".out.emf";
        sr.toImage(j, EmfSheetName);

        IPPImage picture;
        IImage image = Images.fromFile(EmfSheetName);
        try {
            picture = pres.getImages().addImage(image);
        } finally {
            if (image != null) image.dispose();
        }
        ISlide slide = pres.getSlides().addEmptySlide(pres.getLayoutSlides().getByType(SlideLayoutType.Blank));
        IShape m = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 0, 0,
					(float)pres.getSlideSize().getSize().getWidth(), 
					(float)pres.getSlideSize().getSize().getHeight(), 
					picture);
    }
    
    pres.save("output.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

Reemplazar imágenes en la colección de imágenes

Aspose.Slides permite reemplazar imágenes almacenadas en la colección de imágenes de una presentación (incluidas las utilizadas por formas de diapositivas). Esta sección muestra varios enfoques para actualizar imágenes en la colección. La API ofrece métodos sencillos para sustituir una imagen mediante datos binarios sin procesar, una instancia de IImage o otra imagen que ya exista en la colección.

Sigue los pasos a continuación:

  1. Cargar el archivo de presentación que contiene imágenes mediante la clase Presentation.
  2. Cargar una nueva imagen desde un archivo a un array de bytes.
  3. Reemplazar la imagen objetivo con la nueva imagen usando el array de bytes.
  4. En el segundo enfoque, cargar la imagen en un objeto IImage y sustituir la imagen objetivo con ese objeto.
  5. En el tercer enfoque, reemplazar la imagen objetivo con una imagen que ya exista en la colección de imágenes de la presentación.
  6. Guardar la presentación modificada como archivo PPTX.
// Instanciar la clase Presentation que representa un archivo de presentación.
Presentation presentation = new Presentation("sample.pptx");
try {
    // Primera forma.
    IImage imageData = Images.fromStream(new FileInputStream("image0.jpeg"));
    IPPImage oldImage = presentation.getImages().get_Item(0);
    oldImage.replaceImage(imageData);
    
    // Segunda forma.
    IImage newImage = Images.fromFile("image1.png");
    oldImage = presentation.getImages().get_Item(1);
    oldImage.replaceImage(newImage);
    newImage.dispose();
    
    // Tercera forma.
    oldImage = presentation.getImages().get_Item(2);
    oldImage.replaceImage(presentation.getImages().get_Item(3));
    
    // Guardar la presentación en un archivo.
    presentation.save("output.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

FAQ

¿Se mantiene la resolución original de la imagen después de insertarla?

Sí. Los píxeles originales se conservan, pero el aspecto final depende de cómo se escale la picture en la diapositiva y de cualquier compresión aplicada al guardar.

¿Cuál es la mejor manera de reemplazar el mismo logotipo en docenas de diapositivas a la vez?

Coloca el logotipo en la diapositiva maestra o en un diseño y sustitúyelo en la colección de imágenes de la presentación; las actualizaciones se propagarán a todos los elementos que usen ese recurso.

¿Puede un SVG insertado convertirse en formas editables?

Sí. Puedes convertir un SVG en un grupo de formas; después, cada parte individual se vuelve editable mediante las propiedades estándar de forma.

¿Cómo puedo establecer una imagen como fondo para varias diapositivas a la vez?

Asignar la imagen como fondo en la diapositiva maestra o en el diseño correspondiente; todas las diapositivas que usen esa maestra/diseño heredarán el fondo.

¿Cómo evito que la presentación “infle” en tamaño debido a muchas imágenes?

Reutiliza un único recurso de imagen en lugar de duplicados, elige resoluciones razonables, aplica compresión al guardar y mantén los gráficos repetidos en la maestra cuando sea apropiado.