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:
- Vytvořte instanci třídy RasterImage a načtěte existující obrázek.
- Vytvořte instanci třídy ImageOption.
- Vytvořte instanci třídy Rectangle a inicializujte X, Y a šířku, výšku obdélníka.
- 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(); | |
} |