Преобразуване на изображения
Преобразуване на изображения в черно-бяло и в градации на сиво
Понякога може да се наложи да преобразувате цветни изображения в черно-бяло или в градации на сиво за печат или архивни цели. Тази статия демонстрира използването на Aspose.PSD за .NET API за постигане на това използвайки два метода, както е посочено по-долу.
- Бинаризация
- Преобразуване в градации на сиво
Бинаризация
За да разберете понятието за бинаризация, е важно да се дефинира Бинарно изображение; което е цифрово изображение, което може да има само две възможни стойности за всеки пиксел. Обикновено, двата цвята, използвани за бинарно изображение, са черно и бяло, въпреки че може да се използват всеки два цвята. Бинаризацията е процесът на преобразуване на изображение в двунивен, което означава, че всеки пиксел се съхранява като единичен бит (0 или 1), където 0 означава липса на цвят, а 1 означава присъствието на цвят. Aspose.PSD за .NET API в момента поддържа два метода за бинаризация.
Бинаризация с Фиксиран Праг
Следната откъс от код показва как може да се приложи бинаризация с фиксиран праг на изображение.
// 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 в друг формат на равнище на пиксели, за да се отговори на нуждите на приложението. Aspose.PSD API подкрепя функцията за извличане и конвертиране на слоевете на изображение 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, разработчиците могат да конвертират PSD файл CMYK във формат CMYK tiff. Тази статия показва как да експортирате/конвертирате PSD файл CMYK във формат CMYK tiff с 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 и рисува изображения на повърхността на платното, използвайки метода Draw Image, изложен от класа 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(); | |
} |
Разширяване и Изрязване на изображения
Aspose.PSD API ви позволява да разширявате или изрязвате изображение по време на процеса на конвертиране на изображения. Разработчикът трябва да създаде правоъгълник с 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, разработчикът може да създаде обект за 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 | |
} | |
} | |
} |