Convertir imágenes
Convertir imágenes a blanco y negro y escala de grises
A veces puede ser necesario convertir imágenes a color a blanco y negro o escala de grises para imprimir o archivar. Este artículo demuestra el uso de Aspose.PSD para la API de Java para lograr esto mediante dos métodos como se indica a continuación.
- Binzarización
- Escala de grises
Binarización
Para entender el concepto de binarización, es importante definir una imagen binaria; una imagen digital que solo puede tener dos valores posibles para cada píxel. Normalmente, los dos colores utilizados para una imagen binaria son negro y blanco, aunque se pueden usar cualquier par de colores. La binarización es el proceso de convertir una imagen en bi-nivel, lo que significa que cada píxel se almacena como un solo bit (0 o 1) donde 0 denota la ausencia de color y 1 significa la presencia de color. Aspose.PSD para Java API actualmente admite dos métodos de binarización.
Binarización con umbral fijo
El siguiente fragmento de código le muestra cómo se puede aplicar la binarización con umbral fijo a una imagen.
String dataDir = Utils.getDataDir(BinarizationWithFixedThreshold.class) + "Conversion/"; | |
String sourceFile = dataDir + "sample.psd"; | |
String destName = dataDir + "BinarizationWithFixedThreshold_out.jpg"; | |
try (Image image = Image.load(sourceFile); | |
RasterCachedImage rasterCachedImage = (RasterCachedImage) image) { | |
if (!rasterCachedImage.isCached()) { | |
// Cache image if not already cached | |
rasterCachedImage.cacheData(); | |
} | |
// Binarize image with predefined fixed threshold and Save the resultant image | |
rasterCachedImage.binarizeFixed((byte) 100); | |
rasterCachedImage.save(destName, new JpegOptions()); | |
} |
Binarización con umbral de Otsu
El siguiente fragmento de código le muestra cómo se puede aplicar la binarización con umbral de Otsu a una imagen.
String dataDir = Utils.getDataDir(BinarizationWithOtsuThreshold.class) + "Conversion/"; | |
String sourceFile = dataDir + "sample.psd"; | |
String destName = dataDir + "BinarizationWithOtsuThreshold_out.jpg"; | |
try (Image image = Image.load(sourceFile); | |
// Cast the image to RasterCachedImage and Check if image is cached | |
RasterCachedImage rasterCachedImage = (RasterCachedImage) image) { | |
if (!rasterCachedImage.isCached()) { | |
// Cache image if not already cached | |
rasterCachedImage.cacheData(); | |
} | |
// Binarize image with Otsu Thresholding and Save the resultant image | |
rasterCachedImage.binarizeOtsu(); | |
rasterCachedImage.save(destName, new JpegOptions()); | |
} |
Escala de grises
La escala de grises es el proceso de convertir una imagen de tonos continuos a una imagen con tonos de grises discontinuos. El siguiente fragmento de código le muestra cómo utilizar la escala de grises.
String dataDir = Utils.getDataDir(GrayScaling.class) + "Conversion/"; | |
String sourceFile = dataDir + "sample.psd"; | |
String destName = dataDir + "Grayscaling_out.jpg"; | |
try (Image image = Image.load(sourceFile)) { | |
// Cast the image to RasterCachedImage and Check if image is cached | |
RasterCachedImage rasterCachedImage = (RasterCachedImage) image; | |
if (!rasterCachedImage.isCached()) { | |
// Cache image if not already cached | |
rasterCachedImage.cacheData(); | |
} | |
// Transform image to its grayscale representation and Save the resultant image | |
rasterCachedImage.grayscale(); | |
rasterCachedImage.save(destName, new JpegOptions()); | |
} |
Convertir capas de imagen GIF a imagen TIFF
A veces es necesario extraer y convertir capas de una imagen PSD a otro formato de imagen de mapa de bits para satisfacer una necesidad de la aplicación. La API de Aspose.PSD admite la funcionalidad de extraer y convertir capas de una imagen PSD a otro formato de imagen de mapa de bits. En primer lugar, crearemos una instancia de imagen y cargaremos la imagen PSD desde el disco local, luego iteraremos cada capa en la propiedad de Layer. Luego convertiremos el bloque en una imagen TIFF. El siguiente fragmento de código le muestra cómo convertir las capas de imagen PSD en imágenes TIFF.
String dataDir = Utils.getDataDir(GIFImageLayersToTIFF.class) + "Conversion/"; | |
String sourceFile = dataDir + "sample.psd"; | |
// Load a PSD image and Convert the image's layers to Tiff images. | |
try (PsdImage image = (PsdImage) Image.load(sourceFile)) { | |
// Iterate through array of PSD layers | |
for (int i = 0; i < image.getLayers().length; i++) { | |
// Get PSD layer. | |
Layer layer = image.getLayers()[i]; | |
// Create an instance of TIFF Option class and Save the PSD layer as TIFF image | |
TiffOptions objTiff = new TiffOptions(TiffExpectedFormat.TiffDeflateRgb); | |
layer.save("output" + i + "_out.tiff", objTiff); | |
} | |
} |
Convertir PSD CMYK a TIFF CMYK
Usando Aspose.PSD para Java, los desarrolladores pueden convertir un archivo PSD CMYK a formato tiff CMYK. Este artículo muestra cómo exportar / convertir un archivo PSD CMYK a formato tiff CMYK con Aspose.PSD. Usando Aspose.PSD para Java, puede cargar imágenes PSD y luego puede establecer varias propiedades utilizando la clase TiffOptions y guardar o exportar la imagen. El siguiente fragmento de código le muestra cómo lograr esta funcionalidad.
String dataDir = Utils.getDataDir(CMYKPSDtoCMYKTiff.class) + "Conversion/"; | |
String sourceFile = dataDir + "sample.psd"; | |
String destName = dataDir + "output.tiff"; | |
try (Image image = Image.load(sourceFile)) { | |
image.save(destName, new TiffOptions(TiffExpectedFormat.TiffLzwCmyk)); | |
} |
Exportar imágenes
Junto con un conjunto de rutinas de procesamiento de imágenes, Aspose.PSD proporciona clases especializadas para convertir formatos de archivo PSD a otros formatos. Utilizando esta biblioteca, la conversión de imágenes PSD es muy simple e intuitiva. A continuación se muestran algunas clases especializadas para este propósito en el espacio de nombres ImageOptions.
- BmpOptions
- GifOptions
- JpegOptions
- Jpeg2000Options
- TiffOptions
- PngOptions
Es fácil exportar imágenes PSD con la API de Aspose.PSD para Java. Todo lo que necesita es un objeto de la clase apropiada del espacio de nombres ImageOptions. Usando estas clases, puede exportar fácilmente cualquier imagen creada, editada o simplemente cargada con Aspose.PSD para Java a cualquier formato compatible.
Combina Imágenes
Este ejemplo utiliza la clase Graphics y muestra cómo combinar dos o más imágenes en una sola imagen completa. Para demostrar la operación, el ejemplo crea una nueva PsdImage y dibuja imágenes en la superficie del lienzo utilizando el método Draw Image expuesto por la clase Graphics. Usando la clase Graphics, dos o más imágenes pueden combinarse de tal manera que la imagen resultante se verá como una imagen completa sin espacio entre las partes de la imagen y sin páginas. El tamaño del lienzo debe ser igual al tamaño de la imagen resultante. A continuación se muestra una demostración de código que muestra cómo usar el método Draw Image de la clase Graphics para combinar imágenes en una sola imagen.
String dataDir = Utils.getDataDir(CombiningImages.class) + "DrawingAndFormattingImages/"; | |
// Create an instance of PsdOptions and set its various properties | |
PsdOptions imageOptions = new PsdOptions(); | |
// Create an instance of FileCreateSource and assign it to Source property | |
imageOptions.setSource(new FileCreateSource(dataDir + "Two_images_result_out.psd", false)); | |
try (Image image = Image.create(imageOptions, 600, 600)) { | |
// Create and initialize an instance of Graphics, Clear the image surface with white color and Draw Image | |
Graphics graphics = new Graphics(image); | |
graphics.clear(Color.getWhite()); | |
graphics.drawImage(Image.load(dataDir + "example1.psd"), 0, 0, 300, 600); | |
graphics.drawImage(Image.load(dataDir + "example2.psd"), 300, 0, 300, 600); | |
image.save(); | |
} |
Expandir y recortar imágenes
La API de Aspose.PSD le permite expandir o recortar una imagen durante el proceso de conversión de imagen. El desarrollador necesita crear un rectángulo con coordenadas X y Y y especificar el ancho y alto de la caja del rectángulo. Las coordenadas X, Y y Ancho, Altura del rectángulo representarán la expansión o recorte de la imagen cargada. Si es necesario expandir o recortar la imagen durante la conversión de imagen, realice los siguientes pasos:
- Cree una instancia de la clase RasterImage y cargue la imagen existente.
- Cree una instancia de la clase ImageOption.
- Cree una instancia de la clase Rectangle e inicialice las coordenadas X, Y y el ancho, altura del rectángulo.
- Llame al método Save de la clase RasterImage pasando el nombre de archivo de salida, las opciones de imagen y el objeto de rectángulo como parámetros.
String dataDir = Utils.getDataDir(ExpandAndCropImages.class) + "DrawingAndFormattingImages/"; | |
String sourceFile = dataDir + "example1.psd"; | |
String destName = dataDir + "jpeg_out.jpg"; | |
try (RasterImage rasterImage = (RasterImage) Image.load(sourceFile)) { | |
rasterImage.cacheData(); | |
// Create an instance of Rectangle class and define X,Y and Width, height of the rectangle, and Save output image | |
Rectangle destRect = new Rectangle(-200, -200, 300, 300); | |
rasterImage.save(destName, new JpegOptions(), destRect); | |
} |
Leer y Escribir Datos XMP en Imágenes
XMP (Plataforma de Metadatos Extensible) es un estándar ISO. XMP estandariza un modelo de datos, un formato de serialización y propiedades básicas para la definición y procesamiento de metadatos extensibles. También proporciona pautas para incrustar información XMP en imágenes populares como JPEG, sin alterar su legibilidad por aplicaciones que no admiten XMP. Con la API de Aspose.PSD para Java, los desarrolladores pueden leer o escribir metadatos XMP en imágenes. Este artículo demuestra cómo se pueden leer los metadatos XMP de una imagen y escribir metadatos XMP en las imágenes.
Crear metadatos XMP, escribirlos y leer desde archivo
Con la ayuda del espacio de nombres XMP, el desarrollador puede crear un objeto de metadatos XMP y escribirlo en una imagen. El siguiente fragmento de código le muestra cómo usar los paquetes XmpHeaderPi, XmpTrailerPi, XmpMeta, XmpPacketWrapper, PhotoshopPackage y DublinCorePackage contenidos en el espacio de nombres XMP.
String dataDir = Utils.getDataDir(CreateXMPMetadata.class) + "DrawingAndFormattingImages/"; | |
// Specify the size of image by defining a Rectangle | |
Rectangle rect = new Rectangle(0, 0, 100, 200); | |
// create the brand new image just for sample purposes | |
try (PsdImage image = new PsdImage(rect.getWidth(), rect.getHeight())) { | |
// create an instance of XMP-Header | |
XmpHeaderPi xmpHeader = new XmpHeaderPi(); | |
xmpHeader.setGuid(dataDir); | |
// create an instance of Xmp-TrailerPi | |
XmpTrailerPi xmpTrailer = new XmpTrailerPi(true); | |
// create an instance of XMPmeta class to set different attributes | |
XmpMeta xmpMeta = new XmpMeta(); | |
xmpMeta.addAttribute("Author", "Mr Smith"); | |
xmpMeta.addAttribute("Description", "The fake metadata value"); | |
// create an instance of XmpPacketWrapper that contains all metadata | |
XmpPacketWrapper xmpData = new XmpPacketWrapper(xmpHeader, xmpTrailer, xmpMeta); | |
// create an instacne of Photoshop package and set photoshop attributes | |
PhotoshopPackage photoshopPackage = new PhotoshopPackage(); | |
photoshopPackage.setCity("London"); | |
photoshopPackage.setCountry("England"); | |
photoshopPackage.setColorMode(ColorMode.Rgb); | |
// add photoshop package into XMP metadata | |
xmpData.addPackage(photoshopPackage); | |
// create an instacne of DublinCore package and set dublinCore attributes | |
DublinCorePackage dublinCorePackage = new DublinCorePackage(); | |
dublinCorePackage.setAuthor("Charles Bukowski"); | |
dublinCorePackage.setTitle("Confessions of a Man Insane Enough to Live With the Beasts"); | |
dublinCorePackage.addValue("dc:movie", "Barfly"); | |
// add dublinCore Package into XMP metadata | |
xmpData.addPackage(dublinCorePackage); | |
MemoryStream ms = new MemoryStream(); | |
// update XMP metadata into image | |
image.setXmpData(xmpData); | |
// Save image on the disk or in memory stream | |
image.save(dataDir + "create_XMP_Metadata.psd"); | |
} |
Exportar imágenes en un entorno multiproceso
Aspose.PSD para Java ahora admite la conversión de imágenes en un entorno multiproceso. Aspose.PSD para Java garantiza el rendimiento optimizado de las operaciones durante la ejecución de código en un entorno multiproceso. Todas las clases de opciones de imagen (por ej., BmpOptions, TiffOptions, JpegOptions, etc.) en Aspose.PSD para Java implementan la interfaz IDisposable. Por lo tanto, es imprescindible que el desarrollador deseche adecuadamente el objeto de la clase de opciones de imagen en caso de que se establezca la propiedad Source. El siguiente fragmento de código demuestra dicha funcionalidad.
String dataDir = Utils.getDataDir(ExportImagesinMultiThreadEnv.class) + "Conversion/"; | |
String imageDataPath = dataDir + "sample.psd"; | |
try { | |
FileInputStream fileStream = new FileInputStream(imageDataPath); | |
PsdOptions psdOptions = new PsdOptions(); | |
// Set the source property of the imaging option class object. | |
psdOptions.setSource(new StreamSource(fileStream)); | |
// Following is the sample processing on the image. | |
RasterImage image = (RasterImage) Image.create(psdOptions, 10, 10); | |
Color[] pixels = new Color[4]; | |
for (int i = 0; i < 4; ++i) { | |
pixels[i] = Color.fromArgb(40, 30, 20, 10); | |
} | |
image.savePixels(new Rectangle(0, 0, 2, 2), pixels); | |
image.save(); | |
} finally { | |
// Delete the output file. | |
File f = new File(imageDataPath); | |
if (f.exists()) { | |
f.delete(); | |
} | |
} |
Aspose.PSD ahora admite la propiedad SyncRoot mientras se trabaja en un entorno multiproceso. El desarrollador puede usar esta propiedad para sincronizar el acceso a la secuencia de origen. El siguiente fragmento de código demuestra cómo se puede usar la propiedad SyncRoot.
String dataDir = Utils.getDataDir(SyncRoot.class) + "Conversion/"; | |
// Create an instance of Stream container class and assign memory stream object. | |
StreamContainer streamContainer = new StreamContainer(new java.io.ByteArrayInputStream(new byte[0])); | |
try { | |
// check if the access to the stream source is synchronized. | |
synchronized (streamContainer.getSyncRoot()) { | |
// do work | |
// now access to streamContainer is synchronized | |
} | |
} finally { | |
streamContainer.dispose(); | |
} |