Преобразование изображений
Преобразование изображений в черно-белые и градации серого
Иногда вам может понадобиться преобразовать цветные изображения в черно-белые или градации серого для печати или архивирования. В этой статье демонстрируется использование 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, ширина и высота прямоугольника будут изображать расширение или обрезку загруженного изображения. Если требуется расширить или обрезать изображение во время преобразования изображения, выполните следующие шаги:
- Создайте экземпляр класса RasterImage и загрузите существующее изображение.
- Создайте экземпляр класса ImageOption.
- Создайте экземпляр класса Rectangle и инициализируйте координаты X, Y и ширину, высоту прямоугольника.
- Вызовите метод 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 | |
} | |
} | |
} |