Преобразование изображений

Преобразование изображений в черно-белые и градации серого

Иногда вам может понадобиться преобразовать цветные изображения в черно-белые или градации серого для печати или архивирования. В этой статье демонстрируется использование API Aspose.PSD для .NET для достижения этой цели с использованием двух методов, описанных ниже.

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

Бинаризация

Чтобы понять концепцию бинаризации, важно определить бинарное изображение; это цифровое изображение, у которого может быть только два возможных значения для каждого пикселя. Обычно два цвета, используемые для бинарного изображения, - черный и белый, хотя можно использовать любые два цвета. Бинаризация - это процесс преобразования изображения в бивалентное, что означает, что каждый пиксель сохраняется как один бит (0 или 1), где 0 обозначает отсутствие цвета, а 1 означает наличие цвета. API Aspose.PSD для .NET в настоящее время поддерживает два метода бинаризации.

Бинаризация с фиксированным порогом

В следующем фрагменте кода показано, как использовать фиксированную бинаризацию порога на изображении.

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

Бинаризация с порогом Отсу

В следующем фрагменте кода показано, как применить бинаризацию с порогом Отсу к изображению.

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

Преобразование в градации серого

Градации серого - это процесс преобразования изображения с непрерывным тоном в изображение с дискретными оттенками серого. В следующем фрагменте кода показано, как использовать преобразование в градации серого.

Преобразование слоев изображения GIF в изображение TIFF

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

Преобразование CMYK PSD в CMYK TIFF

С помощью Aspose.PSD для .NET разработчики могут преобразовывать файлы CMYK PSD в формат CMYK tiff. В этой статье показано, как экспортировать/преобразовать файл CMYK PSD в формат tiff CMYK с помощью Aspose.PSD. С помощью Aspose.PSD для .NET можно загружать изображения PSD, а затем устанавливать различные свойства с использованием TiffOptions класса и сохранять или экспортировать изображение. В следующем фрагменте кода показано, как достичь этой функции.

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

Экспорт изображений

Помимо богатого набора обработчиков изображений, Aspose.PSD предоставляет специализированные классы для преобразования форматов файлов PSD в другие форматы. Используя эту библиотеку, конвертация изображений PSD является очень простой и интуитивно понятной. Вот некоторые специализированные классы для этой цели в ImageOptions пространстве имен:

Экспортировать изображения PSD с Aspose.PSD для .NET API легко. Вам просто нужен объект соответствующего класса из ImageOptions пространства имен. Используя эти классы, вы легко можете экспортировать любое изображение, созданное, отредактированное или просто загруженное с помощью Aspose.PSD для .NET в любой поддерживаемый формат.

Объединение изображений

Этот пример использует класс Graphics и показывает, как объединить два или более изображений в одно общее изображение. Для демонстрации операции пример создает новое PsdImage и рисует изображения на поверхности холста, используя метод DrawImage, предоставленный классом Graphics. С использованием класса Graphics два или более изображений могут быть объединены таким образом, что результирующее изображение будет выглядеть как целое изображение без промежутков между частями изображения и страниц. Размер холста должен быть равен размеру результирующего изображения. Ниже приведен демонстрационный код, показывающий, как использовать метод DrawImage класса Graphics, чтобы объединить изображения в одно изображение.

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

Расширение и обрезка изображений

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

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

Чтение и запись данных XMP в изображения

XMP (Extensible Metadata Platform) - это стандарт ISO. XMP стандартизирует модель данных, формат сериализации и основные свойства для определения и обработки расширяемых метаданных. Он также предоставляет рекомендации по встраиванию информации XMP в популярное изображение, такое как JPEG, не нарушая их читаемость приложениями, которые не поддерживают XMP. С помощью Aspose.PSD для .NET API разработчики могут читать или записывать метаданные XMP в изображения. В этой статье показано, как метаданные XMP могут быть прочитаны из изображения и записаны в изображения.

Создание метаданных XMP, запись и чтение из файла

С помощью пространства имен Xmp разработчик может создать объект метаданных XMP и записать его в изображение. Ниже приведен фрагмент кода, показывающий, как использовать пакеты XmpHeaderPi, XmpTrailerPi, XmpMeta, XmpPacketWrapper, PhotoshopPackage и DublinCorePackage, содержащиеся в пространстве имен Xmp.

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

Экспорт изображений в многопоточной среде

Aspose.PSD для .NET теперь поддерживает преобразование изображений в многопоточной среде. Aspose.PSD для .NET гарантирует оптимальную производительность операций во время выполнения кода в многопоточной среде. Все классы опций изображения (например BmpOptions, TiffOptions, JpegOptions и т. д.) в Aspose.PSD для .NET реализуют интерфейс IDisposable. Поэтому разработчику необходимо правильно освободить объект класса опций изображения в случае, если свойство Source задано. Ниже приведен фрагмент кода, демонстрирующий указанную функциональность.

// 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 теперь поддерживает свойство SyncRoot при работе в многопоточной среде. Разработчик может использовать это свойство для синхронизации доступа к исходному потоку. Ниже приведен фрагмент кода, демонстрирующий использование свойства SyncRoot.

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