Konwersja obrazów
Konwertowanie obrazów na czarno-białe i w odcieniach szarości
Czasami możesz potrzebować konwertować kolorowe obrazy na czarno-białe lub w odcieniach szarości do celów drukowania lub archiwizacji. W tym artykule przedstawiono użycie interfejsu API Aspose.PSD dla .NET do osiągnięcia tego przy użyciu dwóch metod, jak opisano poniżej.
- Binarizacja
- Skalowanie odcieni szarości
Binarizacja
Aby zrozumieć koncepcję binarizacji, ważne jest zdefiniowanie obrazu binarnego; jest to obraz cyfrowy, który może mieć tylko dwie możliwe wartości dla każdego piksela. Zwykle dwa kolory używane do obrazów binarnych to czerń i biel, choć można użyć dowolnych dwóch kolorów. Binarizacja to proces konwertowania obrazu na dwupoziomowy, co oznacza, że każdy piksel jest przechowywany jako pojedynczy bit (0 lub 1), gdzie 0 oznacza brak koloru, a 1 oznacza obecność koloru. Interfejs API Aspose.PSD dla .NET obecnie obsługuje dwie metody binarizacji.
Binarizacja z ustalonym progiem
Poniższy fragment kodu pokazuje, jak można zastosować binarizację z ustalonym progiem do obrazu.
// 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()); | |
} |
Binarizacja z progiem Otsu
Następujący fragment kodu pokazuje, jak można zastosować binarizację z progiem Otsu do obrazu.
// 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()); | |
} |
Skalowanie odcieni szarości
Skalowanie odcieni szarości to proces konwertowania obrazu o ciągłych odcieniach na obraz z nieciągłymi odcieniami szarości. Poniższy fragment kodu pokazuje, jak używać skalowania odcieni szarości.
Konwertowanie warstw obrazów GIF na obrazy TIFF
Czasami konieczne jest wyodrębnienie i konwersja warstw obrazów PSD na inny format obrazu rastrowego, aby spełnić potrzeby aplikacji. Interfejs API Aspose.PSD obsługuje funkcję wyodrębniania i konwertowania warstw obrazów PSD na inny format obrazu rastrowego. Po pierwsze, utworzymy instancję obrazu i wczytamy obraz PSD z dysku lokalnego, a następnie przeiterujemy każdą warstwę w właściwości Layer. Następnie przekonwertujemy blok do obrazu TIFF. Poniższy fragment kodu pokazuje, jak konwertować warstwy obrazów PSD na obrazy 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); | |
} | |
} |
Konwertowanie pliku PSD CMYK na format TIFF CMYK
Za pomocą interfejsu Aspose.PSD dla .NET, programiści mogą konwertować plik PSD CMYK na format tiff CMYK. W artykule pokazano, jak wyeksportować/konwertować plik PSD CMYK na format tiff CMYK za pomocą Aspose.PSD. Korzystając z Aspose.PSD dla .NET, można wczytać obrazy PSD, a następnie można ustawić różne właściwości za pomocą TiffOptions klasy i zapisać lub wyeksportować obraz. Poniższy fragment kodu pokazuje, jak osiągnąć tę funkcję.
// 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)); | |
} |
Eksportowanie obrazów
Oprócz bogatego zestawu procedur przetwarzania obrazów, Aspose.PSD zapewnia specjalistyczne klasy do konwertowania formatów plików PSD na inne formaty. Korzystając z tej biblioteki, konwersja obrazów PSD jest bardzo prosta i intuicyjna. Poniżej znajdują się specjalistyczne klasy do tego celu w przestrzeni nazw ImageOptions.
Eksportowanie obrazów PSD za pomocą interfejsu API Aspose.PSD dla .NET jest proste. Wszystko, czego potrzebujesz, to obiekt odpowiedniej klasy z przestrzeni nazw ImageOptions. Korzystając z tych klas, łatwo możesz wyeksportować każdy obraz utworzony, edytowany lub po prostu wczytany za pomocą interfejsu Aspose.PSD dla .NET do dowolnie obsługiwanego formatu.
Łączenie obrazów
Ten przykład wykorzystuje klasę Graphics i pokazuje, jak połączyć dwa lub więcej obrazów w pojedynczy obraz kompletu. Aby zademonstrować operację, przykład tworzy nowy obraz PsdImage i rysuje obrazy na powierzchni płótna za pomocą metody Draw Image udostępnionej przez klasę Graphics. Korzystając z klasy Graphics, dwa lub więcej obrazów można połączyć w taki sposób, że wynikowy obraz będzie wyglądał jak kompletny obraz bez odstępów między częściami obrazu i bez stron. Rozmiar płótna musi być równy rozmiarowi obrazu wynikowego. Poniżej znajduje się przykład kodu pokazujący, jak korzystać z metody DrawImage klasy Graphics do łączenia obrazów w pojedynczy obraz.
// 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(); | |
} |
Rozszerzanie i Przycinanie obrazów
Interfejs API Aspose.PSD pozwala na rozszerzanie lub przycinanie obrazu podczas procesu konwersji obrazu. Programista musi utworzyć prostokąt z współrzędnymi X i Y oraz określić szerokość i wysokość prostokąta. Współrzędne X, Y oraz szerokość i wysokość prostokąta będą odzwierciedlały rozszerzanie lub przycinanie wczytanego obrazu. Jeśli podczas konwersji obrazu konieczne jest rozszerzenie lub przycięcie obrazu, wykonaj następujące kroki:
- Utwórz instancję klasy RasterImage i wczytaj istniejący obraz.
- Utwórz instancję klasy ImageOption.
- Utwórz instancję klasy Rectangle i zainicjuj współrzędne X, Y oraz szerokość i wysokość prostokąta.
- Wywołaj Save metodę klasy RasterImage, podając nazwę pliku wyjściowego, opcje obrazu i obiekt prostokąta jako parametry.
// 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); | |
} |
Odczytywanie i Zapisywanie danych XMP do obrazów
XMP (Extensible Metadata Platform) to standard ISO. XMP standaryzuje model danych, format serializacji oraz podstawowe właściwości dla definicji i przetwarzania metadanych rozszerzalnych. Zapewnia również wytyczne dotyczące osadzania informacji XMP w popularnym obrazie, takim jak JPEG, bez utraty czytelności dla aplikacji, które nie obsługują XMP. Korzystając z interfejsu API Aspose.PSD dla .NET, programiści mogą odczytywać lub zapisywać metadane XMP do obrazów. Ten artykuł demonstruje, jak metadane XMP mogą być odczytywane z obrazu i zapisywane do obrazów.
Utwórz obiekt metadanych XMP, Zapisz go i Oczytaj z Pliku
Za pomocą przestrzeni nazw Xmp programista może utworzyć obiekt metadanych XMP i zapisać go do obrazu. Poniższy fragment kodu pokazuje, jak używać pakietów XmpHeaderPi, XmpTrailerPi, XmpMeta, XmpPacketWrapper, PhotoshopPackage i DublinCorePackage zawartych w przestrzeni nazw 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 ... | |
} | |
} | |
} | |
} |
Eksportowanie obrazów w środowisku wielowątkowym
Aspose.PSD dla .NET teraz obsługuje konwersję obrazów w środowisku wielowątkowym. Aspose.PSD dla .NET zapewnia zoptymalizowaną wydajność operacji podczas wykonywania kodu w środowisku wielowątkowym. Wszystkie klasy opcji obrazów (np. BmpOptions, TiffOptions, JpegOptions, itp.) w Aspose.PSD dla .NET implementują interfejs IDisposable. Dlatego konieczne jest prawidłowe zwolnienie obiektu klasy opcji obrazu w przypadku ustawienia właściwości Source. Poniższy fragment kodu demonstruje tę funkcjonalność.
// 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 obsługuje teraz właściwość SyncRoot podczas pracy w środowisku wielowątkowym. Programista może użyć tej właściwości do synchronizacji dostępu do strumienia źródłowego. Poniższy fragment kodu demonstruje, jak można użyć właściwości 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 | |
} | |
} | |
} |