🖼 کار با ImageMagick در C#؛ وقتی System.Drawing دیگر کافی نیست
اگر در یک پروژه NET. با تصویرها کار کرده باشید، احتمالاً خیلی زود به این نیازها میرسید:
🔹 تغییر اندازه تصاویر
🔹 تبدیل فرمت
JPEG، PNG، WebP و ...🔹 ءCrop کردن تصویر
🔹 فشردهسازی
🔹 ساخت Thumbnail
🔹 چرخاندن یا تغییر Orientation
🔹 اضافه کردن Watermark
🔹 پردازش تصاویر در سمت Server
🔹 تولید چند نسخه از یک تصویر با اندازههای مختلف
در پروژههای ساده شاید بتوانید با APIهای معمول NET. بخش زیادی از این کارها را انجام دهید؛ اما وقتی پردازش تصویر جدیتر میشود، معمولاً به یک کتابخانه قدرتمندتر نیاز دارید.
اینجاست که ImageMagick وارد میشود. 🧰
ءImageMagick یک مجموعه ابزار و کتابخانه قدرتمند برای پردازش تصاویر است که از فرمتهای بسیار متنوعی پشتیبانی میکند و در دنیای NET. نیز میتوان از طریق کتابخانههایی مانند Magick.NET با آن کار کرد.
🤔 ءImageMagick دقیقاً چه مشکلی را حل میکند؟
فرض کنید در یک سایت، کاربر یک تصویر با حجم
8 MB و ابعاد 6000 × 4000 آپلود میکند.شما نمیخواهید همان فایل را مستقیماً برای همه کاربران سرو کنید.
ممکن است لازم باشد:
📌 نسخه اصلی را نگه دارید.
📌 یک نسخه
1920px برای Desktop بسازید.📌 یک نسخه
800px برای Mobile بسازید.📌 یک Thumbnail با ابعاد
300 × 300 ایجاد کنید.📌 تصاویر را به
WebP تبدیل کنید.📌 حجم خروجی را کاهش دهید.
📌 ءMetadata غیرضروری را حذف کنید.
یعنی یک فایل ورودی دارید اما چندین خروجی مختلف تولید میکنید.
ءImageMagick دقیقاً برای چنین پردازشهایی بسیار قدرتمند است.
🚀 نصب در پروژه #C
در پروژه NET. میتوانید از Magick.NET استفاده کنید.
برای مثال:
dotnet add package Magick.NET-Q8-AnyCPU
بعد:
using ImageMagick;
حالا میتوانیم یک تصویر را Load کنیم:
using var image = new MagickImage("input.jpg");
Console.WriteLine(image.Width);
Console.WriteLine(image.Height);📐 تغییر اندازه تصویر
یکی از رایجترین عملیاتها:
using var image = new MagickImage("input.jpg");
image.Resize(1200, 0);
image.Write("output.jpg");در اینجا عرض تصویر به
1200px تغییر میکند و ارتفاع متناسب با نسبت تصویر محاسبه میشود.این موضوع برای ساخت نسخههای مختلف تصاویر بسیار کاربردی است.
مثلاً:
Original
│
├── 1920px
├── 1200px
├── 800px
└── 300px Thumbnail
✂️ ؟Crop کردن تصویر
مثلاً میخواهیم بخشی از تصویر را جدا کنیم:
using var image = new MagickImage("input.jpg");
image.Crop(new MagickGeometry(300, 300)
{
IgnoreAspectRatio = true
});
image.Write("cropped.jpg");در پروژههای واقعی میتوانید از این قابلیت برای تولید Avatar، Thumbnail و تصاویر Preview استفاده کنید.
🔄 تبدیل فرمت
یکی از قابلیتهای مهم ImageMagick تبدیل فرمت تصاویر است.
مثلاً:
using var image = new MagickImage("input.jpg");
image.Format = MagickFormat.WebP;
image.Write("output.webp");یعنی:
JPEG
↓
ImageMagick
↓
WebP
این موضوع مخصوصاً برای Web Applicationها مهم است، چون میتوانید نسخهای مناسب برای نمایش در Web تولید کنید و حجم انتقال داده را کاهش دهید.
🗜 کنترل کیفیت و حجم
میتوان کیفیت خروجی را نیز کنترل کرد:
using var image = new MagickImage("input.jpg");
image.Quality = 80;
image.Write("compressed.jpg");اما یک نکته مهم وجود دارد:
ءQuality پایینتر همیشه به معنی نتیجه بهتر نیست.
باید بین:
Image Quality
↕️
File Size
↕️
Network Cost
↕️
Storage Cost
تعادل برقرار کنید.
💧 اضافه کردن Watermark
فرض کنید یک سیستم مدیریت تصاویر دارید و میخواهید روی تصاویر کاربران Watermark قرار دهید. ImageMagick امکان Composite کردن تصاویر را نیز فراهم میکند.
برای مثال:
using var image = new MagickImage("photo.jpg");
using var watermark = new MagickImage("watermark.png");
image.Composite(
watermark,
Gravity.Southeast,
CompositeOperator.Over);
image.Write("result.jpg");حالا Watermark در گوشه تصویر قرار میگیرد.
🏢 یک مثال واقعی در پروژههای بزرگ
فرض کنید یک E-Commerce دارید که روزانه هزاران تصویر محصول دریافت میکند.
کاربر ممکن است تصویری با مشخصات زیر Upload کند:
File Size: 12 MB
Resolution: 8000 × 6000
Format: JPEG
اشتباه این است که همین فایل را مستقیماً در Response به Browser برگردانیم.


