Конвертування Зображень

Конвертування Зображень у Чорно-біле та Відтінки Сірих

Іноді вам може знадобитися конвертувати кольорові зображення в чорно-біле або відтінки сірих для друку чи архівування. Ця стаття демонструє використання 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 з локального диска, потім ми будемо ітерувати кожен шар у властивості Шар. Потім ми конвертуємо блок в зображення 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 у формат tiff CMYK. Ця стаття показує, як експортувати / конвертувати файл CMYK PSD у формат TIFF CMYK за допомогою 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 namespace. Використовуючи ці класи, ви можете легко експортувати будь-яке зображення, створене, відредаговане або просто завантажене за допомогою 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();
}

Розширення та Обрізка Зображень

API Aspose.PSD дозволяє вам розширювати або обрізати зображення під час процесу конвертації зображення. Розробнику потрібно створити прямокутник з координатами 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) є міжнародним стандартом. 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. Тому розробник повинен належним чином видаляти об’єкт класу опцій зображення у випадку встановлення властивості джерела. Наведений нижче фрагмент коду демонструє вказану функціональність.

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