Конвертиране на изображения

Конвертиране на изображения в черно-бяло и сиво

Понякога може да се наложи да конвертирате цветни изображения в черно-бяло или сиво за целите на печат или архивиране. Този материал демонстрира използването на Aspose.PSD за Java API, за да постигнете това чрез два метода, както е посочено по-долу.

  • Бинаризация
  • Преобразуване в сиво

Бинаризация

За да разберете концепцията на бинаризацията, е важно да се дефинира бинарното изображение; което е цифрово изображение, което може да има само две възможни стойности за всеки пиксел. Обикновено двата цвята, използвани за бинарното изображение, са черно и бяло, въпреки че могат да се използват всякакви два цвята. Бинаризацията е процесът на преобразуване на изображение в бивни, което означава, че всеки пиксел се съхранява като единичен бит (0 или 1), като 0 означава липса на цвят, а 1 означава наличие на цвят. В момента Aspose.PSD за Java API поддържа два метода за бинаризация.

Бинаризация с фиксиран праг

Следният откъс код ви показва как се прилага бинаризация с фиксиран праг към изображение.

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

Бинаризация с Otsu праг

Следният откъс код ви показва как се прилага бинаризация с Otsu праг към изображение.

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

Преобразуване в сиво

Преобразуването в сиво е процесът на преобразуване на изображение с непрекъснати тонове в изображение с прекъснати сиви оттенъци. Следният откъс код ви показва как да използвате преобразуването в сиво.

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

Конвертиране на слоевете на GIF изображение в TIFF изображение

Понякога е необходимо да се извлекат и конвертират слоевете на изображение в PSD в друг формат на равен растр, за да отговорят на нуждите на приложение. Aspose.PSD API поддържа възможността за извличане и конвертиране на слоевете на изображение в PSD в друг формат на равен растр. Първо ще създадем инстанция на изображение и ще заредим PSD изображението от локалния диск, след което ще итерираме всеки слой в свойството Layer. След това ще конвертираме блока в TIFF изображение. Следващият откъс код ви показва как да конвертирате слоевете на PSD изображение в 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);
}
}

Конвертиране на CMYK PSD в CMYK TIFF

С помощта на Aspose.PSD за Java, разработчиците могат да конвертират CMYK PSD файл в CMYK TIFF формат. Този материал показва как да експортирате / конвертирате CMYK PSD файл в CMYK tiff формат с Aspose.PSD. Използвайки Aspose.PSD за Java можете да заредите PSD изображения и след това да зададете различни свойства чрез класа TiffOptions и да запазите или експортирате изображението. Следващият откъс код ви показва как да постигнете тази функционалност.

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

Експортиране на изображения

Освен богат набор от рутина за обработка на изображения, Aspose.PSD предоставя специализирани класове за конвертиране на формати на PSD файлове в други формати. Използвайки тази библиотека, конвертирането на PSD изображения е много просто и интуитивно. По-долу са примерни класове за тази цел в пространството на ImageOptions.

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

Постигането на експортиране на PSD изображения с Aspose.PSD за Java API е лесно. Всичко, което ви е необходимо, е обект от съответния клас от пространството на ImageOptions. Чрез използването на тези класове може лесно да експортирате всяко изображение, създадено, редактирано или просто заредено с Aspose.PSD за Java в който и да е поддържан формат.

Комбиниране на изображения

Този пример използва класа Graphics и показва как да комбинирате две или повече изображения в едно цяло изображение. За да демонстрираме операцията, примерът създава ново PsdImage и рисува изображения на повърхността на платното, използвайки метода Draw Image, изложен от класа Graphics. Чрез класа Graphics две или повече изображения могат да бъдат комбинирани по такъв начин, че резултатното изображение да изглежда като цялото изображение без разстояние между частите на изображението и без страници. Размерът на платното трябва да бъде равен на размера на резултатното изображение. Следващият кодов пример показва как да използвате метода Draw Image на класа Graphics, за да комбинирате изображения в едно изображение.

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

Разширяване и Изрязване на изображения

Aspose.PSD API ви позволява да разширите или изрежете изображение по време на процеса на конвертиране на изображението. Разработчикът трябва да създаде правоъгълник с X и Y координати и да посочи ширината и височината на правоъгълната кутия. X,Y и Ширина, Височина на правоъгълника ще покажат разширяването или изрязването на зареденото изображение. Ако е необходимо да разширите или изрежете изображението по време на конвертацията на изображението, изпълнете следните стъпки:

  1. Създайте инстация на класа RasterImage и заредете съществуващото изображение.
  2. Създайте инстация на класа ImageOption.
  3. Създайте инстания на класа Rectangle и инициализирайте X,Y и Ширина, Височина на правоъгълника.
  4. Обадете се на метода Save на класа RasterImage, като подавате името на изходния файл, опциите за изображението и обекта на правоъгълника като параметри.
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);
}

Четене и писане на данни XMP към изображения

XMP (Extensible Metadata Platform) е ISO стандарт. XMP стандартизира данните модел, сериализация формат и основни свойства за дефиниране и обработка на разширяеми метаданни. Той също така предоставя насоки за вграждане на XMP информация в популярни изображения като JPEG, без да нарушава четимостта им от приложения, които не поддържат XMP. С помощта на Aspose.PSD за Java API разработчиците могат да четат или пишат XMP метаданни към изображения. Този материал демонстрира как XMP метаданни могат да бъдат прочетени от изображение и как XMP метаданните могат да бъдат записани към изображения.

Създаване на XMP метаданни, Запис и Четене от файл

С помощта на пространството на XMP разработчик може да създаде обект за XMP метаданни и да го запише към изображение. Следният откъс код ви показва как да използвате пакетите XmpHeaderPi, XmpTrailerPi, XmpMeta, XmpPacketWrapper, PhotoshopPackage и DublinCorePackage, съдържащи се в пространството на 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");
}

Експортиране на изображения в среда с множество нишки

Aspose.PSD за Java вече поддържа конвертирането на изображения в среда с множество нишки. Aspose.PSD за Java гарантира оптимизираната производителност на операциите по време на изпълнение на код в многонишкова среда. Всички класове за опции за изображения (например BmpOptions, TiffOptions, JpegOptions и др.) в Aspose.PSD за Java имплементират интерфейса IDisposable. Поради това е от съществено значение разработчикът правилно да унищожи обекта на класа за опции за изображения, в случай че Source свойството е зададено. Следният откъс код демонстрира съответната функционалност.

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 вече поддържа свойството SyncRoot при работа в многонишкова среда. Разработчикът може да използва това свойство за синхронизиране на достъпа до изходния поток. Следният откъс код показва как може да се използва свойството SyncRoot.

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