Konverze obrázků

Konverze obrázků na černobílé a stupně šedi

Někdy může být potřeba konvertovat barevné obrázky na černobílé nebo stupně šedi pro účely tisku nebo archivace. Tento článek ukazuje použití Aspose.PSD pro Java API k dosažení tohoto pomocí dvou metod, jak je uvedeno níže.

  • Binarizace
  • Převod na stupně šedi

Binarizace

Abychom porozuměli konceptu binarizace, je důležité definovat binární obraz; jedná se o digitální obraz, který může mít pro každý pixel pouze dvě možné hodnoty. Obvykle se pro binární obraz používají dvě barvy - černá a bílá, i když mohou být použity jakékoliv dvě barvy. Binarizace je proces převodu obrázku na binární, což znamená, že každý pixel je uložen jako jediný bit (0 nebo 1), kde 0 znamená absenci barvy a 1 znamená přítomnost barvy. Aspose.PSD pro Java API v současné době podporuje dvě metody binarizace.

Binarizace s pevným prahem

Následující kódová ukázka vám ukazuje, jak aplikovat binarizaci s pevným prahem na obrázek.

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

Binarizace s Otsu prahem

Následující kódová ukázka vám ukazuje, jak aplikovat binarizaci s Otsu prahem na obrázek.

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

Převod na stupně šedi

Šedé škálování je proces převodu obrázku s nepřetržitými tóny na obrázek s přerušenými stupni šedi. Následující kódová ukázka vám ukazuje, jak použít šedé škálování.

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

Převést vrstvy obrázku GIF na obrázek TIFF

Někdy je potřeba extrahovat a převést vrstvy obrázku PSD do jiného rastrového formátu obrázku pro splnění potřeby aplikace. API Aspose.PSD podporuje funkci extrahování 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é budeme iterovat každou vrstvu v vlastnosti Layer. Poté převedeme blok na obrázek TIFF. Následující kódová ukázka vám ukazuje, jak převést vrstvy obrázku PSD na obrázky 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);
}
}

Převod CMYK PSD na CMYK TIFF

Pomocí Aspose.PSD pro Java mohou vývojáři převádět soubor CMYK PSD na formát tiff CMYK. Tento článek ukazuje, jak exportovat / převést soubor CMYK PSD na formát tiff CMYK s pomocí Aspose.PSD. Pomocí Aspose.PSD pro Java můžete načítat obrázky PSD a poté můžete nastavit různé vlastnosti pomocí třídy TiffOptions a uložit nebo exportovat obrázek. Následující kódová ukázka vám ukazuje, jak dosáhnout této funkce.

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

Export obrázků

Kromě bohatého souboru zpracovávacích rutin Aspose.PSD poskytuje specializované třídy pro konverzi formátů souborů PSD na jiné formáty. Použití této knihovny je velmi jednoduché a intuitivní. Zde jsou některé specializované třídy v namespace ImageOptions.

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

S Aspose.PSD pro Java API je snadné exportovat obrázky PSD. Vše, co potřebujete, je objekt příslušné třídy z namespace ImageOptions. Použitím těchto tříd můžete snadno exportovat libovolný obrázek vytvořený, upravený nebo jednoduše načtený pomocí Aspose.PSD pro Java do libovolného 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. K demonstrování operace příklad vytvoří nový PsdImage a nakreslí obrazy na plochu plátna pomocí metody Draw Image vystavené třídou Graphics. Pomocí třídy Graphics lze kombinovat dva nebo více obrázků tak, že výsledný obrázek bude vypadat jako kompletní obraz s žádným prostorem mezi částmi obrázku a žádnými stránkami. Velikost plátna musí být rovna velikosti výsledného obrázku. Následuje kódová ukázka, která ukazuje, jak použít metodu Draw Image třídy Graphics pro kombinaci obrázků do jednoho obrázku.

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

Roztažení a ořezání obrázků

API Aspose.PSD vám umožňuje rozšířit nebo oříznout obrázek během procesu konverze obrázku. Vývojář musí vytvořit obdélník s X a Y souřadnicemi a určit šířku a výšku obdélníkové krabice. X, Y a šířka, výška obdélníka budou znázorňovat rozšíření nebo ořezání načteného obrázku. Pokud je během konverze obrázku nutné rozšířit nebo oříznout obrázek, 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íka.
  4. Zavolejte metodu Save třídy RasterImage a předejte název výstupního souboru, možnosti obrázku a objekt obdélníku jako parametry.
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);
}

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

XMP (Extensible Metadata Platform) je ISO standard. 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 narušily jejich čitelnost aplikacemi, které XMP nepodporují. S využitím Aspose.PSD pro Java API mohou vývojáři číst nebo zapisovat XMP metadata do obrázků. Tento článek ukazuje, jak mohou být metadata XMP přečtena z obrázku a jak mohou být XMP metadata zapsána do obrázků.

Vytvořit XMP Metadata, Zapsat a Číst Ze Souboru

S pomocí prostoru názvů XMP může vývojář vytvořit objekt metadat XMP a zapsat ho do obrázku. Následující kódová ukázka vám ukazuje, jak používat balíčky XmpHeaderPi, XmpTrailerPi, XmpMeta, XmpPacketWrapper, PhotoshopPackage a DublinCorePackage obsažené v prostoru názvů 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");
}

Export obrázků v prostředí vícevláknového prostředí

Aspose.PSD pro Java nyní podporuje konverzi obrázků v prostředí vícevláknového prostředí. Aspose.PSD pro Java zajistí optimalizovaný výkon operací během provádění kódu v vícevláknovém prostředí. Všechny třídy možností obrázků (např. BmpOptions, TiffOptions, JpegOptions atd.) v Aspose.PSD pro Java implementují rozhraní IDisposable. Proto je důležité, aby vývojář správně uvolnil objekt třídy možností obrázku v případě, že je nastavena vlastnost Source. Následující kódová ukázka ukazuje uvedenou funkcionalitu.

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

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