تحويل الصور

تحويل الصور إلى أبيض وأسود ودرجات اللون الرمادي

أحيانًا قد تحتاج إلى تحويل الصور الملونة إلى صور أبيض وأسود أو درجات الرمادي لأغراض الطباعة أو الأرشفة. يوضح هذا المقال استخدام Aspose.PSD لـ .NET API لتحقيق ذلك باستخدام طريقتين كما هو موضح أدناه.

  • تحويل ثنائي
  • تحويل إلى درجات الرمادي

تحويل ثنائي

من أجل فهم مفهوم التحويل الثنائي، من الضروري تعريف الصورة الثنائية؛ وهي صورة رقمية يمكن أن تكون لها قيمتان ممكنتان فقط لكل بكسل. عادةً ما تكون اللونين المستخدمين للصورة الثنائية هما الأسود والأبيض على الرغم من أنه يمكن استخدام أي لونين. يعد التحويل الثنائي عملية تحويل الصور إلى مستوى ثنائي، معنى ذلك هو أن يتم تخزين كل بكسل كبتة واحدة (0 أو 1) حيث يعني 0 عدم وجود لون و1 يعني وجود لون. تدعم حاليًا واجهة برمجة التطبيقات 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());
}

تحويل الثنائي بعتبة Otsu

تُظهر مقاطع الكود التالية كيف يمكن تطبيق تحويل الثنائي بعتبة Otsu على الصورة.

// 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 من القرص المحلي، ثم سنكرر كل طبقة في خاصية الطبقات. ثم سوف نحول الكتلة إلى صورة 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 إلى TIFF CMYK

باستخدام Aspose.PSD لـ .NET، يمكن للمطورين تحويل ملف CMYK PSD إلى تنسيق TIFF CMYK. يوضح هذا المقال كيفية تصدير/تحويل ملف CMYK PSD إلى تنسيق TIFF CMYK باستخدام Aspose.PSD. باستخدام Aspose.PSD لـ .NET يمكنك تحميل الصور PSD ومن ثم يمكنك تعيين خصائص مختلفة باستخدام TiffOptions class وحفظ أو تصدير الصورة. مقتطف الكود التالي يوضح كيفية تحقيق هذه الميزة.

// 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 جديد وترسم الصور على سطح القماش باستخدام طريقة رسم الصورة المكشوفة بواسطة فئة 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 يمكن للمطور إنشاء كائن بيانات وصفية 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. لذلك من الضروري أن يتصرف المطور بشكل صحيح للتخلص من كائن فئة خيارات الصور في حال تم تعيين خاصية الأصل. يوضح مقتطف الكود التالي هذه الوظيفة.

// 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 أثناء العمل في بيئة متعددة الخيوط. يمكن للمطور استخدام هذه الخاصية لمزامنة الوصول إلى تدفق المصدر. يوضح مقتط