Převádění obrázků

Převádění obrázků na černobílou a stupně šedi

Někdy může být potřeba převést barevné obrázky na černobílou nebo stupně šedi pro tisk nebo archivaci. Tento článek ukazuje, jak pomocí Aspose.PSD prohodit obrázky pomocí dvou metod, jak je uvedeno níže.

  • Binární
  • Stupně šedi

Binární

Pro pochopení konceptu binarizace je důležité definovat binární obraz; digitální obraz, který může mít pouze dvě možné hodnoty pro každý pixel. Obvykle jsou pro binární obraz použity dvě barvy, černá a bílá, ačkoli lze použít kteroukoli dvojici barev. Binární je proces převádění obrazu na dvouúrovňový, což znamená, že každý pixel je uložen jako jeden bit (0 nebo 1), kde 0 znamená absenci barvy a 1 značí přítomnost barvy. Aspose.PSD pro .NET API v současné době podporuje dvě metody binarizace.

Binární s pevným prahem

Následující ukázka kódu ukazuje, jak lze na obraz použít binarizaci s pevným prahem.

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

Binární s Otsuovým prahem

Následující ukázka kódu ukazuje, jak lze na obrázek aplikovat binarizaci s Otsuovým prahem.

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

Stupně šedi

Stupně šedi jsou procesem převodu obrazu s plynulými odstíny šedi na obraz s útržkovitými odstíny šedé. Následující ukázka kódu ukazuje, jak použít stupně šedi.

Převést vrstvy obrazu GIF na obraz TIFF

Někdy je potřeba extrahovat a převést vrstvy obrázku PSD do jiného rastrového formátu obrázku z důvodu splnění potřeby aplikace. Aspose.PSD API podporuje funkci extrakce a převodu vrstev obrázku PSD do jiného rastrového formátu obrázku. Nejprve vytvoříme instanci obrázku a načteme obrázek PSD z lokálního disku, poté iterujeme každou vrstvu v vlastnosti Layer. Poté provedeme konverzi bloku na obrázek TIFF. Následující ukázka kódu ukazuje, jak převést vrstvy obrázku PSD na obrázky 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);
}
}

Převádění CMYK PSD na CMYK TIFF

Pomocí Aspose.PSD pro .NET mohou vývojáři převádět soubor CMYK PSD na formát tiff v režimu CMYK. Tento článek ukazuje, jak exportovat/převést soubor CMYK PSD na formát tiff s Aspose.PSD. S Aspose.PSD pro .NET můžete načítat obrázky PSD a nastavovat různé vlastnosti pomocí TiffOptions třídy a ukládat nebo exportovat obrázek. Následující ukázka kódu ukazuje, jak tohoto dosáhnout.

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

Exportování obrázků

Kromě bohatého souboru rutin pro zpracování obrázků poskytuje Aspose.PSD specializované třídy pro převod formátů souborů PSD na jiné formáty. Použitím této knihovny je velmi jednoduché a intuitivní převádět obrázky PSD na jiné formáty. Níže jsou některé specializované třídy pro tento účel ve jmenném prostoru ImageOptions.

S Aspose.PSD pro .NET API je snadné exportovat obrázky PSD. Stačí vám objekt příslušné třídy z jmenného prostoru ImageOptions. Použitím těchto tříd můžete snadno exportovat libovolný obrázek vytvořený, upravený nebo jednoduše načtený s Aspose.PSD pro .NET do jakéhokoli podporovaného formátu.

Kombinace obrázků

Tento příklad používá třídu Graphics a ukazuje, jak kombinovat dva nebo více obrázků do jednoho kompletního obrázku. Pro demonstraci operace vytvoří příklad nový PsdImage a vykreslí obrázky na plochu plátna pomocí metody Draw Image exposed. Pomocí třídy Graphics mohou být dva nebo více obrázků spojeny tak, že výsledný obrázek bude vypadat jako kompletní obrázek bez mezery mezi částmi obrázku a bez stránek. Velikost plátna musí být rovna velikosti výsledného obrázku. Níže je ukázka kódu, která ukazuje, jak používat DrawImage metodu Graphics třídy kombinovat obrázky do jednoho obrázku.

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

Rozšíření a ořezání obrázků

Aspose.PSD API vám umožňuje během procesu konverze obrázku rozšířit nebo oříznout obrázek. Vývojář musí vytvořit obdélník s X a Y souřadnicemi a určit šířku a výšku obdélníkového pole. X, Y a šířka, výška obdélníku budou zobrazovat rozšíření nebo ořezání načteného obrázku. Pokud má být obrázek během konverze rozšířen nebo oříznut, proveďte následující kroky:

  1. Vytvořte instanci třídy RasterImage a načtěte existující obrázek.
  2. Vytvořte instanci třídy ImageOption.
  3. Vytvořte instanci třídy Rectangle a inicializujte X, Y a šířku, výšku obdélníku.
  4. Zavolejte metodu Save třídy RasterImage s předáním názvu výstupního souboru, možností obrázku a objektem obdélníku jako parametry.
// 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);
}

Čtení a zápis dat XMP do obrázků

XMP (Extensible Metadata Platform) je standard ISO. XMP standardizuje datový model, formát serializace a základní vlastnosti pro definici a zpracování rozšiřitelných metadat. Poskytuje také pokyny pro vložení informací XMP do populárních obrázků, jako je JPEG, aniž by porušoval jejich čitelnost aplikacemi, které nepodporují XMP. Pomocí Aspose.PSD pro .NET API mohou vývojáři číst nebo zapisovat XMP metadata do obrázků. Tento článek ukazuje, jak lze číst XMP metadata z obrázku a zapisovat XMP metadata do obrázků.

Vytvořte XMP Metadata, Zapište jej a přečtěte z souboru

S pomocí jmenného prostoru Xmp může vývojář vytvořit objekt XMP metadata a zapsat ho do obrázku. Následující ukázka kódu ukazuje, jak používat Balík XmpHeaderPi, XmpTrailerPi, XmpMeta, XmpPacketWrapper, PhotoshopPackage a DublinCorePackage obsažené v Xmp jmenném prostoru.

// 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 ...
}
}
}
}

Exportování obrázků v prostředí s více vlákny

Aspose.PSD pro .NET nyní podporuje převádění obrázků v prostředí s více vlákny. Aspose.PSD pro .NET zajistí optimalizovaný výkon operací během provádění kódu v prostředí s více vlákny. Všechny třídy možností obrazu (např. BmpOptions, TiffOptions, JpegOptions atd.) v Aspose.PSD pro .NET implementují rozhraní IDisposable. Proto je nutné, aby vývojář správně zrušil objekt třídy možností obrázku v případě nastavení vlastnosti Source. Následující ukázka kódu ukazuje tuto funkcionalitu.

// 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 nyní podporuje vlastnost SyncRoot při práci v prostředí s více vlákny. Vývojář může tuto vlastnost použít k synchronizaci přístupu k zdrojovému proudu. Následující ukázka kódu ukazuje, jak může být vlastnost SyncRoot použita.

// 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
}
}
}