نویسندگان : محیا مهدیان و محمد حسن ستاریان
ImageMagick یک مجموعه فوقالعاده از کتابخانه (Libraries) و برنامه (Binaries) رایگان و متنباز و چندسکویی برای کار با تصاویر پیکسلی (Raster Graphics) و برداری (Vector Graphics) با امکانات فراوان برای نمایش، تبدیل، تغییر و ویرایش است و میتواند با بیش از ۲۰۰ فرمت مختلف تصویر کارکند. از این برنامه میتوان از طریق رابط خط فرمان (CLI) و یا برنامه های نوشته شده توسط کتابخانههای آن در زبانهای دیگر استفاده کرد. برای آشنایی با ImageMagick تنها به این پست اکتفا نکرده و حتما مستندات آن را بخوانید.
برای مثال تمامی تغییرات زیر به راحتی با استفاده از خط فرمان قابل اعمال به تصاویر هستند:
در ادامه چندتا از دستورات پر استفاده را مرور میکنیم. اما قبل از آن روش نصب:
نصب
ImageMagick چندسکویی بوده و برای سیستمعاملهای مختلف در دسترس است. برای استفاده از آن میتوان از کتابخانههای آن برای زبانهای مختلف من جمله C و ++C، پایتون، PHP و غیره استفاده کرد و یا برنامههای آماده (Binaries) آن را نصب و استفاده کرد.
ویندوز
برای نصب ImageMgick در ویندوز میتوان فایل نصب (exe) آن را دریافت کرد و یا با استفاده از پکیج منیجر Chocolatey (از اینجا دریافت کنید) با وارد کردن دستور زیر در CMD آن را نصب کرد:
1 |
choco install imagemagick |
لینوکس
برای نصب ImageMagick روی لینوکس، از دستورات زیر استفاده میکنیم:
1 2 |
sudo apt update sudo apt install imagemagick |
روش استفاده
استفاده از ImageMagick توسط رابط خط فرمان بسیار ساده است (لیست مثالهای استفاده). قالب اجرای دستورات با استفاده از دستور magick --help و magick -usage به صورت زیر است (برای مشاهده کامل خروجی روی کد دوبار کلیک کنید):
9 10 11 12 |
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 برای آدرسدهی پشتیبانی میکند. بنابراین بجای تغییر چندین تصویر بجای دستور حلقه زیر:
1 |
for %f in (*.png) do magick mogrify -resize 50% $f |
از دستور زیر استفاده میکنیم:
1 |
magick mogrify -resize 50% *.png |
که مزیت آن علاوه بر سادگی، قابلیت همزمان سازی ImageMagick است که سرعت کار را افزایش میدهد.
دستورات
نمایش (Display)
برای نمایش تصویر میتوان در ویندوز از دستور imdisplay و در لینوکس از magick display استفاده کرد.
1 2 3 4 5 |
# Windows imdisplay image.png # Linux magick display image.png |
تبدیل (Convert)
برای تبدیل فرمت تصویر کافیست مانند نمونه دستور زیر فرمت خروجی را مشخص کنید:
1 |
magick image.jpg image.png |
همچنین با استفاده از دستور convert نیز میتوان فرمت تصویر را تغییر داد و به علاوه این دستور میهواند تغییرات دیگری نیز در حین تغییر فرمت بدهد. برای مثال دستور زیر لبههای تصویر (که نتیجه اعمال فیلتر canny با سایز کرنل مشخص شده است) را در فایل خروجی ذخیره میکند:
1 |
magick convert image.jpg -canny 0x1 -negate image-canny.jpg |
کاهش کیفیت (Reduce Quality)
از راههای فشردهسازی تصویر کاهش رزولوشن آن است با دستور زیر میتوان درصد کیفیت تصویر خروجی را مشخص کرد. اینکار نیز با دستور convert قابل انجام است:
1 |
convert image.jpg -quality 75 output_file.jpg |
تغییر سایز (Resize)
برای تغییر سایز تصویر میتوان از دستور resize استفاده کرد. روشهای دیگر مشخص کردن سایز خروجی را ببینید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 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 به سرعت و تنها با یک دستور میتوانیم یک تصویر مختلط از چندین تصویر درست کنیم:
1 2 3 4 |
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 استفاده کنیم:
1 2 3 |
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 استفاده کنیم. آدرس تصویر نوشته شده ( :rose ) آدرس عکسهای نمونه قابل استفاده شناخته شده توسط magick است که برای تست میتوان استفاده کرد.
1 2 3 4 5 |
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 |
دستور اول عکسی با سایز ۴۰ پیکسل در ۳۰ پیکسل تولید خواهد کرد که از مختصات ۱۰ در ۱۰ تا تصویر برش زده خواهد شد -درواقع برشی به طول ۴۰ پیکسل و عرض ۳۰ پیکسل از مختصات ۱۰ در ۱۰ از تصویر گرفته میشود؛ بدیهی است اگر ناحیه برش از تصویر بزرگتر باشد تنها قسمت برش خورده، تصویر خروجی خواهد بود- دستور دوم تصویری خروجی با حداکثر اندازه ۰ پیکسل در ۳۰ پیکسل خواهد داشت که نتیجه برش از مختصات ۴۰ در ۳۰ است، برای دستور سوم نیز تصویری خروجی برابر نتیجه برشی با اندازه ۴۰ پیکسل در ۳۰ از مختصات ۱۰- در ۱۰- و دستور چهارم، تصویر خروجی ای از نتیجه برش تصویر به مساحت ۹۰ پیکسل در ۶۰ از مختصات ۱۰- در ۱۰- خواهد داشت؛ چون که این ناحیه شامل کل تصویر است تصویر خروجی با ورودی تفاوتی ندارد. در دستور پنجم که عکس خروجی نتیجه برش تصویر از مختصات ۹۰ در ۶۰ با سایز ۴۰ پیکسل در ۳۰ پیکسل خواهد بود، ناحیه برش هیچ قسمتی از عکس را شامل نمیشود، بنابراین عکسی خالی خواهد ساخت.
چرخاندن (Rotation)
برای چرخواندن تصویر به صورت زیر عمل میکنیم. مقدار مثبت rotate به معنی چرخش ساعتگرد و مقدار منفی آن به معنی چرخش پادساعتگرد است.:
1 2 3 |
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 است که شامل متحرکسازی، کار به متنها، کار با تصاویر دیجیتال و خام و غیره میشود. بنابراین مطالعه مستندات و نمونه موارد استفاده در درک تواناییهای آن موثرتر خواهد بود.
شبکه های اجتماعی