TGViewer
C# Geeks (.NET) C# Geeks (.NET) @csharpgeeks · 550 subscribers
Post #774 205
🖼 کار با 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 برگردانیم.
More from @csharpgeeks
  1. Sep 22, 2026یه مدتی قراره از دنیای NET. فاصله بگیرم، چون وقتشه برم سربازی. راستش نمیدونم این مدت رو چج…
  2. Sep 20, 2026🔥 حالا مشکل اصلی: Alert Storm فرض کن Database از دسترس خارج شده. ۱۰۰ Pod داری. هر Pod می‌…
  3. Sep 20, 2026🚨 طراحی سیستم Monitoring و Alerting در یک سیستم بزرگ فرض کن ساعت ۳ صبح است. سیستم شما با…
  4. Sep 19, 2026#Engineering_Leadership تصمیم نگرفتن هم یک تصمیم است یه چیز عجیب توی تیم‌های مهندسی: گاهی…
  5. Sep 19, 2026☑ چک‌لیست آماده‌سازی تیم، فرایندها و زیرساخت برای توسعه با AI توجه: هیچ چک‌لیستی جهان‌شمول…
  6. Sep 19, 2026📌پایان یک انتظار طولانی: اعتبارسنجی ناهمگام (Async Validation) در NET 11.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →