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:
- Creare un’istanza della classe RasterImage e caricare l’immagine esistente.
- Creare un’istanza della classe ImageOption.
- Creare un’istanza della classe Rectangle e inizializzare le coordinate X, Y e la larghezza, l’altezza del rettangolo.
- 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(); | |
} |