پردازش داده‌های خام

پردازش داده‌های خام

برای بهبود عملکرد API Aspose.PSD ما یک روش برای پردازش داده‌های خام با نسخه 2.4.0 معرفی کردیم. پردازش داده‌های خام در حال حاضر به صورت داخلی استفاده شده و دارای یک API خارجی است تا بتواند از خارج از کتابخانه برای بهبود عملکرد کلی استفاده شود. گاهی اوقات پردازش کمی پیچیده می‌شود و نیاز به توضیحاتی دارد. پردازش داده‌های خام در حال حاضر فقط برای فرمت BMP در دسترس است.

برای کمک به توسعه‌دهندگان در ارائه بهترین عملکرد، API Aspose.PSD یک سیستم پردازش داده‌های خام ارائه می‌دهد که دارای یک API خارجی برای سفارشی‌سازی است. توسعه‌دهندگان تابع‌های LoadRawData و SaveRawData را فراخوانی کرده و از کلاس RawDataSettings برای تنظیم فرمت مورد نظر داده‌های خام استفاده می‌کنند. این توابع همچنین نیازمند تنظیمات داده‌های خام مورد نظر برای استفاده هستند. با این حال، برای دستیابی به بهترین عملکرد نیاز است از فرمت داده‌های خام که داده‌ها در آن ذخیره شده‌اند، استفاده شود. کلاس RawDataSettings تعریف شده در کلاس RasterImage به تعیین فرمت داده‌های خام تصویر کمک می‌کند. هنگام گذراندن نمونه RawDataSettings به تابع LoadRawData، داده به همان شکل برگردانده می‌شود بدون هیچگونه تبدیلی اعمال شده و ممکن است عملکرد را بهبود بخشد. از طرف دیگر، باید از تمام فرمت‌های ممکن داده‌های خام مراقبت کرد که گاهی اوقات کمی پیچیده می‌شود.

برای ساده‌سازی فرآیند، با هزینه‌ای از کارایی، ممکن است تنظیمات RawDataSettings موردنیاز را با ساخت نمونه و مقداردهی کردن کلاس با تنظیمات داده‌های خام مورد نظر تعیین کرد. مواردی وجود دارد که امکان بازگرداندن داده‌های خام بر ااساس فرمت مشخص‌شده نیست (مثلا تبدیل از CMYK به RGB در نسخه 2.4.0 امکان‌پذیر نیست). علاوه بر این، ممکن است سناریوهایی وجود داشته باشد که برای یک فرمت تصویری پردازش داده‌های خام در دسترس نباشد. برای تعیین اینکه آیا می‌توانید از توانایی خانواده توابع LoadRawData و SaveRawData استفاده کنید، نیاز است به ویژگی IsRawDataAvailable پرس و جو کنید.

بینش

برای فرمت داده‌های پیکسل RGB، فرمت‌های داده‌های خام مبتنی بر فهرست و مبتنی بر RGB موجود هستند. فرمت‌های داده‌های خام فهرست دارای فهرست ورودی هستند در محدوده 0 تا (2^تعداد بیت‌ها - 1). فرمت‌های داده‌های خام فهرست 1، 2، 4 و 8 بیت در هر پیکسل هستند. بقیه، فرمت‌های داده‌های خام مبتنی بر RGB هستند. هنگام بارگذاری داده‌های خام، مراقب باشید که بایت‌های کافی برای بارگذاری داده‌ها موجود باشند، در غیر اینصورت یک استثناء مناسب پرتاب می‌شود. می‌توانید به سادگی اندازه آرایه بایت را با ضرب اندازه خط با تعداد خطوط مورد نیاز تخمین بزنید. اندازه خط ممکن است متفاوت باشد و وابسته به فرمت ذخیره داده‌های خام است.

برای دستیابی به بهترین عملکرد همیشه از یک اندازه خط داده‌های خام برابر با مقدار خصوصیت RasterImage.RawLineSize استفاده کنید. با این وجود، گاهی اوقات ممکن است نیاز به اضافه کردن پدینگ اضافی به ردیف‌های داده‌های خام یا کاهش آن باشد و در صورت لزوم از اندازه خط متفاوتی استفاده شود. اگر یک زیرمجموعه از یک مستطیل تصویر مورد نیاز است، آنگاه لازم است به شیفت‌های بیت توجه کنید که ممکن است برای فرمت‌های پیکسل RGB فهرستی رخ دهد. به عنوان مثال، در نظر بگیرید یک تصویر با ابعاد 100x100 پیکسل و فرمت داده‌های خام 1 بیت در هر پیکسل است. می‌خواهید یک مستطیل داده‌های خام با موقعیت (7،0) و ابعاد (2،1) بارگذاری کنید، یا به عبارت دیگر، 2 پیکسل از x=7 و y=0 را دریافت کنید. در این حالت، باید چینش داده زیر را دریافت کنید:

todo:image_alt_text

این به این معناست که شما 2 بایت دریافت می‌کنید که بایت اول شامل 7 پیکسل غیرمطلوب است، سپس 1 پیکسل مطلوب، و بایت دوم شامل 1 پیکسل مطلوب و سپس 7 پیکسل غیرمطلوب است. ممکن است بپرسید چرا ما شیفت داده و این 2 پیکسل را وارد یک بایت نکرده‌ایم؟ پاسخ ساده است: برای حفظ عملکرد بالا. تمام پردازش داخلی معمولاً با تمام داده‌ها از اولین پیکسل شروع شده و با آخرین پیکسل در دسترس پایان می‌یابد. مواقع نادری وجود دارد که یک زیرمجموعه پیکسل مورد نیاز است. به همین ترتیب، بیت صحیح را که پیکسل‌های درخواست شده آغاز خواهد شد، باید تخمین زده شود. برای محاسبه بیت درست، می‌توان از یک فرمول ساده استفاده کرد: (rect.Left * تعداد بیت‌ها) % 8.

تبدیل رنگ RGB فهرستی

برای به دست آوردن بهترین عملکرد ممکن، همیشه باید از تنظیمات داده‌های خام، فرمت‌های پیکسل مبدأ و مقصد و اندازه‌های خط یکسان استفاده کنید. با این حال، گاهی اوقات ممکن است نیاز به انجام تبدیل داده باشد. به عنوان مثال ممکن است تصویر RGB با 1 بیت در هر پیکسل را بارگذاری کرده و با 2 بیت در هر پیکسل ذخیره کنید، یا تصویر RGB 4 بیتی را بارگذاری کنید و محدوده رنگ آن را به 2 بیت در هر پیکسل کاهش دهید. در هر دو مورد، باید برای انجام تبدیل رنگ اقدام کنید. گاهی تبدیل تصاویر RGB فهرستی ممکن است پیچیده باشد و بدون تعیین برخی تنظیمات قابل اجرا نباشد. باید تعیین کنیم که از چگونگی بازه رنگ مبدأ به فضای رنگ مقصد استفاده شود. برای انجام این کار ما انواع حالت‌های داریم:

  • تبدیل پالت (DitheringMethods.PaletteConversion)
  • تصویر گیری داده‌ها (DitheringMethods.PaletteIgnore)
  • تبدیل سفارشی (DitheringMethods.CustomConverter)

هنگام استفاده از تبدیل پالت، فضای رنگ مبدا تلاش می‌کند تا به فضای رنگ مقصد به چهار نزدیکترین مطابقت را داشته باشد. به عنوان مثال فرض کنید یک تصویر 4 بیتی با رنگ‌های زیر داریم: [0] RGB=0, 0, 0 [1] RGB=17, 17, 17 [2] RGB=34, 34, 34 [3] RGB=51, 51, 51 [4] RGB=68, 68, 68 [5] RGB=85, 85, 85 [6] RGB=102, 102, 102 [7] RGB=119, 119, 119 [8] RGB=136, 136, 136 [9] RGB=153, 153, 153 [10] RGB=170, 170, 170 [11] RGB=187, 187, 187 [12] RGB=204, 204, 204 [13] RGB=221, 221, 221 [14] RGB=238, 238, 238 [15] RGB=255, 255, 255

تصویر مبدا مانند زیر است:

todo:image_alt_text

و ما تصویر 4 بیتی را به تصویر 1 بیتی با رنگ‌های پالت تعریف شده زیر تبدیل می‌کنیم:

[0] RGB = 0, 0, 0 [1] RGB = 255, 255, 255

در حالت تبدیل پالت، تبدیل‌کننده رنگ مبدا رنگ را ملاحظه می‌کند و با استفاده از متد GetNearestColorIndex پالت مقصد، شاخص مقصد را تعیین می‌کند. مقدار خصوصیت RasterImage.RawFallbackIndex به کار می‌رود در صورتی که متد GetNearestColorIndex پالت شاخص خارج از محدوده را ارائه دهد. این تبدیل‌ها رنگ‌های مبدا را به نزدیک‌ترین رنگ‌های مقصد به جهت مقادیر شدت مطابقت مناسب تبدیل می‌کند. تصویر مقصد بهترین مطابقت را با تصویر مبدا دارد ممکن است نتیجه زیر را ببینید:

todo:image_alt_text

در حالت تصویر گیری داده‌ها، یک سناریو متفاوت استفاده می‌شود. پالت‌های رنگ مبدا و مقصد به سادگی نادیده گرفته می‌شوند و شاخص‌های مبدأ بر روی شاخص‌های مقصد تصویری می‌شود. هنگامی که یک مقدار پیدا شود که نمی‌تواند در محدوده مقصد نقشه برد (هنگام کاهش تعداد بیت‌ها)، مقدار خصوصیت RasterImage.RawFallbackIndex استفاده می‌شود. مقدار این خصوصیت از پیش 0 استفاده می‌شود و به اولین رنگ در پالت مقصد نقشه برد می‌شود. اگر مقدار این خصوصیت خارج از محدوده مقصد باشد، یک استثناء مناسب پرتاب می‌شود که منجر