محمدحسن ستاریان
محمدحسن ستاریان
خواندن ۶ دقیقه·۵ سال پیش

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


ImageMagick یک مجموعه فوق‌العاده از کتابخانه‌ها (Libraries) و برنامه‌های (Binaries) رایگان و متن‌باز و چندسکویی برای کار با تصاویر پیکسلی (Raster Graphics) و برداری (Vector Graphics) با امکانات فراوان برای نمایش، تبدیل، تغییر و ویرایش است که می‌تواند با بیش از ۲۰۰ فرمت مختلف تصویر کار کند. از این برنامه می‌توان از طریق رابط خط فرمان (CLI) و یا برنامه‌ های شخص ثالث (Third-party) نوشته شده توسط کتابخانه‌های آن در زبان‌های دیگر استفاده کرد. برای آشنایی با ImageMagick تنها به این پست اکتفا نکرده و حتما مستندات آن را بخوانید.

برای مثال تمامی تغییرات زیر به راحتی با استفاده از خط فرمان قابل اعمال به تصاویر هستند:

لیست دستورات و امکانات 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
نتیجه لبه‌یابی با روش 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 را بررسی کنم.


این پست در تیر ۹۷ در وبلاگ بینایی ماشین منتشر شده بوده است.

تصویرimage
توسعه دهنده؛ متمرکز بر برنامه‌نویسی سمت وب و هوش مصنوعی. linktr.ee/mh_sattarian
شاید از این پست‌ها خوشتان بیاید