آشنایی با ImageMagick برای کار با تصاویر

‏ImageMagick یک مجموعه فوق‌العاده از کتابخانه‌ها (Libraries) و برنامه‌های (Binaries) رایگان و متن‌باز و چندسکویی برای کار با تصاویر پیکسلی (Raster Graphics) و برداری (Vector Graphics) با امکانات فراوان برای نمایش، تبدیل، تغییر و ویرایش است که می‌تواند با بیش از ۲۰۰ فرمت مختلف تصویر کار کند. از این برنامه می‌توان از طریق رابط خط فرمان (CLI) و یا برنامه‌ های شخص ثالث (Third-party) نوشته شده توسط کتابخانه‌های آن در زبان‌های دیگر استفاده کرد. برای آشنایی با ImageMagick تنها به این پست اکتفا نکرده و حتما مستندات آن را بخوانید.برای مثال تمامی تغییرات زیر به راحتی با استفاده از خط فرمان قابل اعمال به تصاویر هستند:لیست دستورات و امکانات ImageMagickدر ادامه چندتا از دستورات پر استفاده را مرور می‌کنیم. اما قبل از آن روش نصب:نصب‏ImageMagick چندسکویی بوده و برای سیستم‌عامل‌های مختلف در دسترس است. برای استفاده از آن می‌توان از کتابخانه‌های آن برای زبان‌های مختلف مثل C و ++C، پایتون، PHP و غیره استفاده کرد و یا برنامه‌های آماده (Binaries) آن را نصب و استفاده کرد که در ادامه بررسی می‌کنیم:ویندوزبرای نصب ImageMgick در ویندوز می‌توان فایل نصب (exe) آن را دریافت کرد و یا با استفاده از پکیج منیجر Chocolatey (از اینجا دریافت کنید) با وارد کردن دستور زیر در CMD آن را نصب کرد:> choco install imagemagickلینوکسبرای نصب ImageMagick روی لینوکس، از دستورات زیر استفاده می‌کنیم:$ sudo apt update #update package lists $ sudo apt install imagemagickاطلاعات بیشترروش استفادهاستفاده از ImageMagick توسط رابط خط فرمان (CLI) بسیار ساده است (لیست مثال‌های استفاده). قالب اجرای دستورات با استفاده از دستور magick --help و magick -usage قابل مشاهده است:Usage: magick tool [ {option} | {image} ... ] {output_image} Usage: magick [ {option} | {image} ... ] {output_image} magick [ {option} | {image} ... ] -script {filename} [ {script_args} ...] magick -help | -version | -usage | -list {option}قالب تمامی دستورات شامل، خواندن تصویر، اعمال تغیرات روی آن و مشخص کردن خروجی است.در ویندوز تمامی عملیات‌ها با دستور magick شروع می‌شوند و گاهی لازم است پس از دستور magick علمیات مربوطه نیز نوشته شود (لیست دستورات)، اما در لینوکس دستورات با اسم عملیات شروع می‌شوند.پس توجه داشته باشیم دستورات به فرم magick convert در لینوکس به صورت convert استفاده خواهند شد.همچنین ImageMagick از globbing برای آدرس‌دهی پشتیبانی می‌کند. بنابراین بجای تغییر چندین تصویر بجای دستور حلقه زیر:> for %f in (*.‌png) do magick mogrify -resize 50% $fاز دستور زیر استفاده می‌کنیم:> magick mogrify -resize 50% *.pngکه مزیت آن علاوه بر سادگی، قابلیت همزمان سازی ImageMagick است که سرعت کار را افزایش می‌دهد.دستوراتنمایش (Display)برای نمایش تصویر می‌توان در ویندوز از دستور imdisplay و در لینوکس از magick display استفاده کرد.# Windows > imdisplay image.png # Linux $ magick display image.pngتبدیل (Convert)برای تبدیل فرمت تصویر کافیست، مانند نمونه دستور زیر، فرمت خروجی را مشخص کنید:> magick image.jpg image.pngهمچنین با استفاده از دستور convert نیز می‌توان فرمت تصویر را تغییر داد؛ به علاوه، این دستور می‌تواند تغییرات دیگری نیز انجام بدهد. برای مثال دستور زیر لبه‌های تصویر (که نتیجه اعمال فیلتر canny با سایز کرنل مشخص شده است) را در فایل خروجی ذخیره می‌کند:> magick convert image.jpg -canny 0x1 -negate image-canny.jpgنتیجه لبه‌یابی با روش cannyکاهش کیفیت (Reduce Quality)از راه‌های فشرده‌سازی تصویر کاهش رزولوشن آن است، با دستور زیر می‌توان درصد کیفیت تصویر خروجی را مشخص کرد. اینکار نیز با دستور convert قابل انجام است:> convert image.jpg -quality 75 output_file.jpgتغییر سایز (Resize)برای تغییر سایز تصویر می‌توان از دستور resize استفاده کرد:# Using precentage > magick image.png -resize '200%' bigWiz.png # Using percentage for one axis > magick image.png -resize '200x50%' longShortWiz.png # Maximum values of height and width given, aspect ratio preserved. > magick image.png -resize '100x200' notThinWiz.png # Minimum values of width and height given, aspect ratio preserved. > magick image.png -resize '100x200^' biggerNotThinWiz.png # Width and height emphatically given, original aspect ratio ignored. > magick image.png -resize '100x200!' dochThinWiz.png # Or, using mogrify > magick mogrify -resize 80% image.jpgبا استفاده از دستور mogrify نتیجه در خود تصویر ورودی ذخیره می‌شود بنابراین دیگر نیازی به مشخص کردن فایل خروجی نیست.روش‌های دیگر مشخص کردن سایز خروجی را ببینید.تصویر مختلط (Collage)به کمک magick به سرعت و تنها با یک دستور می‌توانیم یک تصویر مختلط از چندین تصویر درست کنیم:> magick montage image1.jpg image2.jpg image3.jpg image4.jpg output_montage.jpg # Using custom geometry and title > magick montage image1.jpg image2.jpg image3.jpg image4.jpg -geometry +10+10 -title 'Collage_title' output_montage.jpgبا اجرای خط اول تصویر خروجی کیفیت خوبی نخواهد داشت، دلیل آن مقادیر پیش‌فرض برای geometry است که برابر ۱۲۰ پیکسل تنظیم شده. در خط دوم با وارد کردن مقدار مورد نظر برای geometry گفته‌ایم سایز تصاویر تغییر نکنند و سایز حاشیه تصاویر را برابر ۱۰ پیکسل تنظیم کرده‌ایم.بریدن تصویر (Cropping)برای بریدن تصویر از طرفین می‌توان از دستور shave استفاده کنیم:> magick convert border.gif -shave 10x10 shave.gif > magick convert border.gif -shave 10x0 shave_sides.gif > magick convert border.gif -shave 0x20 shave_topbot.gif۱. دستور اول، ۱۰ پیکسل از محور x و ۱۰ پیکسل از y از دو سمت تصویر را برش می‌دهد. ۲. دستور دوم، تنها ۱۰ پیکسل از دوسمت محور x تصویر را برش می‌دهد.۳. دستور سوم، ۲۰ پیکسل از دو سمت محور y تصویر را برش می‌دهد.برای بریدن ناحیه دلخواه از تصویر باید از دستور crop استفاده کنیم:> magick convert rose: -crop 40x30+10+10 crop.gif > magick convert rose: -crop 40x30+40+30 crop_br.gif > magick convert rose: -crop 40x30-10-10 crop_tl.gif > magick convert rose: -crop 90x60-10-10 crop_all.gif > magick convert rose: -crop 40x30+90+60 crop_miss.gifآدرس تصویر نوشته شده (:rose ) آدرس عکس‌های نمونه قابل استفاده، شناخته شده توسط magick است که برای تست می‌توان استفاده کرد. لیست این تصاویر در قسمت Built-in Images در این صفحه قابل مشاهده‌اند.۱. دستور اول، عکسی با سایز ۴۰ پیکسل در ۳۰ پیکسل تولید خواهد کرد که از مختصات ۱۰ در ۱۰ از تصویر برش زده خواهد شد. درواقع برشی به طول ۴۰ پیکسل و عرض ۳۰ پیکسل از مختصات ۱۰ در ۱۰ از تصویر گرفته می‌شود؛ بدیهی است اگر ناحیه برش از تصویر بزرگتر باشد، تنها قسمت برش خورده، تصویر خروجی خواهد بود.۲. دستور دوم، تصویری خروجی با حداکثر اندازه ۴۰ پیکسل در ۳۰ پیکسل خواهد داشت که نتیجه برش از مختصات ۴۰ در ۳۰ است.۳. دستور سوم نیز تصویری خروجی برابر نتیجه برشی با اندازه ۴۰ پیکسل در ۳۰ از مختصات ۱۰- در ۱۰- خواهد داشت.۴. دستور چهارم، تصویر خروجی ای از نتیجه برش تصویر به مساحت ۹۰ پیکسل در ۶۰ پیکسل از مختصات ۱۰- در ۱۰- خواهد داشت؛ چون که این ناحیه شامل کل تصویر است، تصویر خروجی با ورودی تفاوتی ندارد. ۵. دستور پنجم که عکس خروجی نتیجه برش تصویر از مختصات ۹۰ در ۶۰ با سایز ۴۰ پیکسل در ۳۰ پیکسل خواهد بود، ناحیه برش هیچ قسمتی از عکس را شامل نمی‌شود، بنابراین عکسی خالی خواهد ساخت.چرخاندن (Rotation)برای چرخواندن تصویر به صورت زیر عمل می‌کنیم (مقدار مثبت rotate به معنی چرخش ساعتگرد و مقدار منفی آن به معنی چرخش پادساعتگرد است):> magick convert koala.gif -rotate 30 rotate.jpg > magick convert koala.gif -background lightskyblue -rotate 30 rotate_color.png > magick convert koala.gif -alpha set -background none -rotate 30 rotate_trans.png۱. دستور اول تصویر را ۳۰ درجه ساعتگرد می‌چرخاند.۲. دستور دوم تصویر را ۳۰ درجه ساعتگرد چرخانده و پس‌زمینه ناشی از حذف تصویر را با رنگ تعیین شده پر می‌کند. ۳. دستور سوم تصویر را چرخانده و پس‌زمینه آن را حذف می‌کند.توجه کنید که برای داشتن تصویر بدون پس‌زمینه، به فرمتی آن را ذخیره کنید که از کد رنگ آلفا پشتیبانی کند. برای مثال فرمت PNG تصویر بدون پس‌زمینه را به درستی ذخیره می‌کند اما فرمت JPG تصویر بدون پس‌زمینه را با پس‌زمینه سفید ذخیره می‌کند.موارد فوق تنها قسمت کوچکی از توانایی‌های ImageMagick است که شامل متحرک‌سازی، کار با متن‌ها، کار با تصاویر دیجیتال و تصاویر خام و ... می‌شود. بنابراین مطالعه مستندات و نمونه موارد استفاده در درک توانایی‌های آن موثرتر خواهد بود که البته سعی می‌کنم در پست‌های بعدی این امکانات ImageMagick را بررسی کنم.این پست در تیر ۹۷ در وبلاگ بینایی ماشین منتشر شده بوده است.