Conversione delle immagini
Conversione delle immagini in bianco e nero e scala di grigi
A volte potresti aver bisogno di convertire immagini a colori in bianco e nero o in scala di grigi per scopi di stampa o archiviazione. Questo articolo illustra l’uso di Aspose.PSD per l’API .NET per raggiungere questo scopo utilizzando due metodi come indicato di seguito.
- Binariazione
- Scala di grigi
Binariazione
Per capire il concetto di binariazione, è importante definire un’immagine binaria; cioè un’immagine digitale che può avere solo due possibili valori per ogni pixel. Normalmente, i due colori utilizzati per un’immagine binaria sono il nero e il bianco anche se possono essere usati qualsiasi due colori. La binarizzazione è il processo di conversione di un’immagine in bianco e nero, il che significa che ogni pixel è memorizzato come un singolo bit (0 o 1) dove 0 indica l’assenza di colore e 1 significa presenza di colore. Attualmente, Aspose.PSD per .NET API supporta due metodi di binariazione.
Binariazione con soglia fissa
Il seguente frammento di codice ti mostra come utilizzare la binariazione con soglia fissa per applicarla a un’immagine.
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
string sourceFile = dataDir + @"sample.psd"; | |
string destName = dataDir + @"BinarizationWithFixedThreshold_out.jpg"; | |
// Load an image | |
using (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 predefined fixed threshold and Save the resultant image | |
rasterCachedImage.BinarizeFixed(100); | |
rasterCachedImage.Save(destName, new JpegOptions()); | |
} |
Binariazione con soglia di Otsu
Il seguente frammento di codice ti mostra come applicare la binariazione con soglia di Otsu a un’immagine.
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
string sourceFile = dataDir + @"sample.psd"; | |
string destName = dataDir + @"BinarizationWithOtsuThreshold_out.jpg"; | |
// Load an image | |
using (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 ti mostra come utilizzare la Scala di grigi.
Convertire i livelli di immagine GIF in immagine TIFF
A volte è necessario estrarre e convertire i livelli di un’immagine PSD in un’altra immagine raster per soddisfare le esigenze di un’applicazione. L’API di Aspose.PSD supporta la funzionalità di estrazione e conversione dei livelli di un’immagine PSD in un’altra immagine raster. Innanzitutto, creeremo un’istanza dell’immagine e caricheremo l’immagine PSD dal disco locale, quindi iteraeremo su ogni livello nella proprietà Layer. Quindi convertiremo il blocco in immagine TIFF. Il seguente frammento di codice ti mostra come convertire i livelli di un’immagine PSD in immagini TIFF.
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
string sourceFile = dataDir + @"sample.psd"; | |
string destName = dataDir + @"output"; | |
// Load a PSD image and Convert the image's layers to Tiff images. | |
using (PsdImage image = (PsdImage)Image.Load(sourceFile)) | |
{ | |
// Iterate through array of PSD layers | |
for (int i = 0; i < image.Layers.Length; i++) | |
{ | |
// Get PSD layer. | |
Layer layer = image.Layers[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.tif", objTiff); | |
} | |
} |
Conversione di PSD CMYK in TIFF CMYK
Utilizzando Aspose.PSD per .NET, i programmatori possono convertire un file PSD CMYK in formato TIFF CMYK. Questo articolo mostra come esportare / convertire un file PSD CMYK in formato TIFF CMYK con Aspose.PSD. Utilizzando Aspose.PSD per .NET è possibile caricare immagini PSD e quindi è possibile impostare diverse proprietà utilizzando la classe TiffOptions e salvare o esportare l’immagine. Il seguente frammento di codice mostra come ottenere questa funzionalità.
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
string sourceFile = dataDir + @"sample.psd"; | |
string destName = dataDir + @"output.tiff"; | |
using (Image image = Image.Load(sourceFile)) | |
{ | |
image.Save(destName, new TiffOptions(TiffExpectedFormat.TiffLzwCmyk)); | |
} |
Esportazione di immagini
Oltre a un ricco insieme di routine di elaborazione delle immagini, Aspose.PSD fornisce classi specializzate per convertire i formati dei file PSD in altri formati. Utilizzando questa libreria, la conversione delle immagini PSD è molto semplice e intuitiva. Di seguito sono riportate alcune classi specializzate per questo scopo nel ImageOptions namespace.
È facile esportare le immagini PSD con Aspose.PSD for .NET API. Tutto ciò di cui hai bisogno è un oggetto della classe appropriata da ImageOptions namespace. Utilizzando queste classi, è possibile esportare facilmente qualsiasi immagine creata, modificata o semplicemente caricata con Aspose.PSD for .NET in qualsiasi formato supportato.
Unione di 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 le immagini sulla superficie del canvas utilizzando il metodo DrawImage 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. La dimensione del canvas deve essere uguale alla dimensione dell’immagine risultante. Di seguito è riportata la dimostrazione del codice che mostra come utilizzare il metodo DrawImage della classe Graphics per combinare le immagini in un’unica immagine.
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
// 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.Source = new FileCreateSource(dataDir + "Two_images_result_out.psd", false); | |
// Create an instance of Image and define canvas size | |
using (var image = Image.Create(imageOptions, 600, 600)) | |
{ | |
// Create and initialize an instance of Graphics, Clear the image surface with white color and Draw Image | |
var graphics = new Graphics(image); | |
graphics.Clear(Color.White); | |
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
L’API Aspose.PSD ti consente di espandere o ritagliare un’immagine durante il processo di conversione dell’immagine. Il programmatore deve creare un rettangolo con coordinate X e Y e specificare la larghezza e l’altezza del rettangolo. Le coordinate X, Y e larghezza, altezza del rettangolo mostreranno 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 larghezza, 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.
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
string sourceFile = dataDir + @"example1.psd"; | |
string destName = dataDir + @"jpeg_out.jpg"; | |
// Load an image in an instance of Image and Setting for image data to be cashed | |
using (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 { X = -200, Y = -200, Width = 300, Height = 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à principali per la definizione e l’elaborazione di metadati estensibili. Fornisce anche linee guida per l’incorporazione di informazioni XMP in un’immagine popolare come JPEG, senza comprometterne la leggibilità da parte di applicazioni che non supportano XMP. Utilizzando l’API Aspose.PSD per .NET, i programmatori possono leggere o scrivere metadati XMP nelle immagini. Questo articolo dimostra come i metadati XMP possono essere letti da un’immagine e come i metadati XMP possono essere scritti nelle immagini.
Creare metadati XMP, scriverli e leggerli dal file
Con l’aiuto dello spazio dei nomi Xmp, il programmatore può creare un oggetto di metadati XMP e scriverlo nell’immagine. Il seguente frammento di codice mostra come utilizzare i pacchetti XmpHeaderPi, XmpTrailerPi, XmpMeta, XmpPacketWrapper, PhotoshopPackage e DublinCorePackage contenuti nello spazio dei nomi Xmp.
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
// 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 | |
using (var image = new PsdImage(rect.Width, rect.Height)) | |
{ | |
// Create an instance of XMP-Header | |
XmpHeaderPi xmpHeader = new XmpHeaderPi(Guid.NewGuid().ToString()); | |
// Create an instance of Xmp-TrailerPi, XMPmeta class to set different attributes | |
XmpTrailerPi xmpTrailer = new XmpTrailerPi(true); | |
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); | |
photoshopPackage.SetCreatedDate(DateTime.UtcNow); | |
// 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("Mudassir Fayyaz"); | |
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); | |
using (var ms = new MemoryStream()) | |
{ | |
// Update XMP metadata into image and Save image on the disk or in memory stream | |
image.XmpData = xmpData; | |
image.Save(ms); | |
image.Save(dataDir + "ee.psd"); | |
ms.Seek(0, System.IO.SeekOrigin.Begin); | |
// Load the image from memory stream or from disk to read/get the metadata | |
using (var img = (PsdImage)Image.Load(ms)) | |
{ | |
// Getting the XMP metadata | |
XmpPacketWrapper imgXmpData = img.XmpData; | |
foreach (XmpPackage package in imgXmpData.Packages) | |
{ | |
// Use package data ... | |
} | |
} | |
} | |
} |
Esportare immagini in ambiente multi-threaded
Aspose.PSD per .NET supporta ora la conversione delle immagini in un ambiente multi-threaded. Aspose.PSD per .NET garantisce le prestazioni ottimizzate delle operazioni durante l’esecuzione del codice in un ambiente multi-threaded. Tutte le classi delle opzioni per l’immagine (ad esempio BmpOptions, TiffOptions, JpegOptions, ecc.) in Aspose.PSD for .NET implementano l’interfaccia IDisposable. Pertanto, è importante che il programmatore disponga correttamente dell’oggetto della classe delle opzioni dell’immagine nel caso in cui la proprietà Source sia impostata. Il seguente frammento di codice dimostra la funzionalità menzionata.
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
string imageDataPath = dataDir + @"sample.psd"; | |
try | |
{ | |
// Create the stream of the existing image file. | |
using (System.IO.FileStream fileStream = System.IO.File.Create(imageDataPath)) | |
{ | |
// Create an instance of PSD image option class. | |
using (PsdOptions psdOptions = new PsdOptions()) | |
{ | |
// Set the source property of the imaging option class object. | |
psdOptions.Source = new Sources.StreamSource(fileStream); | |
// DO PROCESSING. | |
// Following is the sample processing on the image. Un-comment to use it. | |
//using (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 file. This statement is in the final block because in any case this statement should execute to make it sure that resource is properly disposed off. | |
System.IO.File.Delete(imageDataPath); | |
} |
Aspose.PSD supporta ora la proprietà SyncRoot durante il lavoro in un ambiente multi-threaded. Il programmatore può utilizzare questa proprietà per sincronizzare l’accesso allo stream di origine. Il seguente frammento di codice mostra come può essere utilizzata la proprietà SyncRoot.
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
// Create an instance of Memory stream class. | |
using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream()) | |
{ | |
// Create an instance of Stream container class and assign memory stream object. | |
using (StreamContainer streamContainer = new StreamContainer(memoryStream)) | |
{ | |
// check if the access to the stream source is synchronized. | |
lock (streamContainer.SyncRoot) | |
{ | |
// do work | |
// now access to source MemoryStream is synchronized | |
} | |
} | |
} |