Conversione Immagini

Converting Immagini in Bianco e Nero e Scala di Grigi

A volte potresti aver bisogno di convertire immagini a colori in Bianco e Nero o Scala di Grigi per scopi di stampa o archiviazione. Questo articolo dimostra l’uso di Aspose.PSD per l’API Java per raggiungere questo obiettivo utilizzando due metodi come indicato di seguito.

  • Binarizzazione
  • Scala di grigi

Binarizzazione

Per comprendere il concetto di Binarizzazione, è importante definire un’Immagine Binaria; ossia un’immagine digitale che può avere solo due possibili valori per ogni pixel. Normalmente, i due colori utilizzati per un’immagine binaria sono nero e bianco, anche se possono essere utilizzati due colori qualsiasi. La Binarizzazione è il processo di conversione di un’immagine in bi-livello, il che significa che ogni pixel è memorizzato come un singolo bit (0 o 1) dove 0 denota l’assenza di colore e 1 significa presenza di colore. Aspose.PSD per l’API Java attualmente supporta due metodi di Binarizzazione.

Binarizzazione con Soglia Fissa

Il seguente frammento di codice mostra come utilizzare la binarizzazione con soglia fissa che può essere applicata a un’immagine.

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());
}

Binarizzazione con Soglia di Otsu

Il seguente frammento di codice mostra come applicare la binarizzazione con soglia di Otsu a un’immagine.

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());
}

Scala di Grigi

La scala di grigi è il processo di conversione di un’immagine a toni continui in un’immagine con sfumature di grigio discontinuo. Il seguente frammento di codice mostra come utilizzare la Scala di Grigi.

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());
}

Convertire Livelli Immagine GIF in Immagine TIFF

A volte è necessario estrarre e convertire i livelli di un’Immagine PSD in un altro formato di immagine raster per soddisfare un’esigenza dell’applicazione. L’API Aspose.PSD supporta la funzionalità di estrazione e conversione dei livelli di un’Immagine PSD in un altro formato di immagine raster. Prima creeremo un’istanza di immagine e caricheremo l’immagine PSD dal disco locale, quindi itereremo su ciascun livello nella proprietà Layer. Poi convertiremo il blocco in immagine TIFF. Il seguente frammento di codice mostra come convertire i livelli di un’immagine PSD in immagini 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);
}
}

Converting CMDYK PSD in CMDYK TIFF

Utilizzando Aspose.PSD per Java, gli sviluppatori possono convertire il file CMDYK PSD in formato TIFF CMDYK. Questo articolo mostra come esportare / convertire il file CMDYK PSD in formato TIFF CMDYK con Aspose.PSD. Utilizzando Aspose.PSD per Java è possibile caricare immagini PSD e quindi è possibile impostare varie proprietà utilizzando la classe TiffOptions e salvare o esportare l’immagine. Il seguente frammento di codice mostra come raggiungere questa funzionalità.

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));
}

Esportare Immagini

Oltre a un ricco set di routine di elaborazione delle immagini, Aspose.PSD fornisce classi specializzate per convertire formati di file PSD in altri formati. Utilizzando questa libreria, la conversione delle immagini PSD è molto semplice e intuitiva. Di seguito sono riportate alcune classi specializzate a tale scopo nello spazio dei nomi ImageOptions.

  • BmpOptions
  • GifOptions
  • JpegOptions
  • Jpeg2000Options
  • TiffOptions
  • PngOptions

È facile esportare immagini PSD con Aspose.PSD per Java API. Tutto ciò di cui hai bisogno è un oggetto della classe appropriata dello spazio dei nomi ImageOptions. Utilizzando queste classi, è possibile esportare facilmente qualsiasi immagine creata, modificata o semplicemente caricata con Aspose.PSD per Java in qualsiasi formato supportato.

Combinare Immagini

Questo esempio utilizza la classe Graphics e mostra come combinare due o più immagini in un’unica immagine completa. Per dimostrare l’operazione, l’esempio crea una nuova PsdImage e disegna immagini sulla superficie del canvas utilizzando il metodo Draw Image esposto dalla classe Graphics. Utilizzando la classe Graphics, due o più immagini possono essere combinate in modo che l’immagine risultante sembri un’immagine completa senza spazio tra le parti dell’immagine e senza pagine. Le dimensioni del canvas devono essere uguali alle dimensioni dell’immagine risultante. Di seguito è riportata la dimostrazione del codice che mostra come utilizzare il metodo Draw Image della classe Graphics per combinare immagini in un’unica immagine.

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();
}

Espandere e Ritagliare Immagini

Aspose.PSD API consente di espandere o ritagliare un’immagine durante il processo di conversione dell’immagine. Lo sviluppatore deve creare un rettangolo con coordinate X e Y e specificare la larghezza e l’altezza della scatola rettangolare. Le coordinate X, Y e la larghezza, altezza del rettangolo rappresenteranno l’espansione o il ritaglio dell’immagine caricata. Se è necessario espandere o ritagliare l’immagine durante la conversione dell’immagine, eseguire i seguenti passaggi:

  1. Creare un’istanza della classe RasterImage e caricare l’immagine esistente.
  2. Creare un’istanza della classe ImageOption.
  3. Creare un’istanza della classe Rectangle e inizializzare le coordinate X, Y e la larghezza, l’altezza del rettangolo.
  4. Chiamare il metodo Save della classe RasterImage passando il nome del file di output, le opzioni dell’immagine e l’oggetto rettangolo come parametri.
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);
}

Leggere e Scrivere Dati XMP nelle Immagini

XMP (Extensible Metadata Platform) è uno standard ISO. XMP standardizza un modello di dati, un formato di serializzazione e proprietà core per la definizione e l’elaborazione di metadati estensibili. Fornisce inoltre linee guida per l’incorporazione delle informazioni XMP in immagini popolari come JPEG, senza comprometterne la leggibilità da parte di applicazioni che non supportano XMP. Utilizzando l’API Aspose.PSD per Java, gli sviluppatori possono leggere o scrivere metadati XMP nelle immagini. Questo articolo dimostra come i metadati XMP possono essere letti dall’immagine e come i metadati XMP possono essere scritti nelle immagini.

Creare Metadati XMP, Scrivere e Leggerli dal File

Con l’aiuto dello spazio dei nomi XMP, lo sviluppatore può creare un oggetto di metadati XMP e scriverlo in un’immagine. Il seguente frammento di codice mostra come utilizzare i pacchetti XmpHeaderPi, XmpTrailerPi, XmpMeta, XmpPacketWrapper, PhotoshopPackage e DublinCorePackage contenuti nello spazio dei nomi 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");
}

Esportare Immagini in un Ambiente Multithread

Aspose.PSD per Java supporta ora la conversione di immagini in un ambiente multithread. Aspose.PSD per Java garantisce le prestazioni ottimizzate delle operazioni durante l’esecuzione del codice in un ambiente multithread. Tutte le classi di opzioni delle immagini (ad es. BmpOptions, TiffOptions, JpegOptions, ecc.) in Aspose.PSD per Java implementano l’interfaccia IDisposable. Pertanto è necessario che lo sviluppatore disponga correttamente dell’oggetto della classe di opzioni delle immagini nel caso in cui venga impostata la proprietà Source. Il seguente frammento di codice dimostra la suddetta funzionalità.

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 ora supporta la proprietà SyncRoot mentre si lavora in un ambiente multithread. Lo sviluppatore può utilizzare questa proprietà per sincronizzare l’accesso allo stream di origine. Il seguente frammento di codice dimostra come la proprietà SyncRoot può essere utilizzata.

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();
}