معالجة الصور بلغة Go: تغيير الحجم والقص (resize, crop)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع الصور بلغة Go: تغيير الحجم (resize) والقص (crop)

\n\n

في تطوير الويب الحديث وإنشاء خدمات الخلفية، غالبًا ما تنشأ الحاجة إلى معالجة ملفات الرسوم: تقليل الوزن، التوحيد إلى تنسيق موحد، إنشاء الصور المصغرة. تقدم لغة Go (Golang) العديد من المكتبات القوية والفعالة للعمل مع الصور. في هذه المقالة، سننظر بالتفصيل في عمليتين رئيسيتين — تغيير الحجم (resize) و القص (crop) — باستخدام الأدوات الشائعة.

\n\n

لماذا Go لمعالجة الصور؟

\n

يتم تجميع Go إلى كود أصلي، ويتمتع بأداء عالٍ ودعم مدمج لتعدد الخيوط. وهذا يجعله خيارًا ممتازًا لإنشاء خدمات عالية التحميل لمعالجة الصور. على عكس Python، حيث تُستخدم غالبًا وسادة Pillow (إضافات C)، توفر Go تطبيقات Go نقية يسهل دمجها في بنية الخدمات المصغرة.

\n\n

المكتبات الرئيسية

\n
    \n
  • github.com/disintegration/imaging — المكتبة الأكثر شيوعًا. توفر واجهة برمجة تطبيقات مريحة لعمليات resize, crop, rotate, blur وغيرها. تعمل فوق الحزمة القياسية image.
  • \n
  • github.com/nfnt/resize — واحدة من أولى المكتبات. تتميز بالسرعة العالية ودعم خوارزميات الاستيفاء المختلفة (NearestNeighbor, Bilinear, Lanczos2, Lanczos3).
  • \n
  • github.com/anthonynsimon/bild — مشروع أحدث يركز على الأداء ونظافة الكود. يدعم resize, crop, التأثيرات.
  • \n
\n\n

في هذه المقالة، سنركز على مكتبة imaging باعتبارها الأكثر توازنًا من حيث الوظائف وسهولة الاستخدام.

\n\n

التثبيت

\n

للبدء، تحتاج إلى تثبيت المكتبة باستخدام go get:

\n
go get github.com/disintegration/imaging
\n\n

تغيير حجم الصورة (Resize)

\n

تتيح عملية resize تغيير مقياس الصورة إلى أبعاد جديدة. تدعم مكتبة imaging عدة أوضاع:

\n
    \n
  • Fit — يلائم الصورة داخل مستطيل محدد مع الحفاظ على النسب.
  • \n
  • Fill — يملأ المستطيل، ويقص الحواف عند الضرورة.
  • \n
  • Resize — تغيير دقيق إلى العرض والارتفاع المحددين (بدون الحفاظ على النسب).
  • \n
\n\n

مثال على تغيير الحجم الأساسي مع الحفاظ على النسب (Fit):

\n
package main\n\nimport (\n    "github.com/disintegration/imaging"\n    "log"\n)\n\nfunc main() {\n    // فتح الصورة الأصلية\n    src, err := imaging.Open("input.jpg")\n    if err != nil {\n        log.Fatalf("خطأ في الفتح: %v", err)\n    }\n\n    // تغيير الحجم إلى عرض 800px، يتم حساب الارتفاع تلقائيًا\n    dst := imaging.Fit(src, 800, 600, imaging.Lanczos)\n\n    // حفظ النتيجة\n    err = imaging.Save(dst, "output_fit.jpg")\n    if err != nil {\n        log.Fatalf("خطأ في الحفظ: %v", err)\n    }\n    log.Println("تمت معالجة الصورة بنجاح!")\n}
\n\n

إذا كنت بحاجة إلى تغيير دقيق للحجم (على سبيل المثال، لإنشاء معاينة 150x150):

\n
// تغيير دقيق للحجم (قد يشوه النسب)\ndst := imaging.Resize(src, 150, 150, imaging.Lanczos)
\n\n

قص الصورة (Crop)

\n

يسمح القص بإزالة جزء من الصورة. في imaging هناك طريقتان رئيسيتان:

\n
    \n
  • Crop — يقطع منطقة مستطيلة بإحداثيات محددة.
  • \n
  • CropCenter — يقطع المنطقة المركزية بالحجم المحدد.
  • \n
\n\n

مثال على قص الجزء المركزي (مفيد لإنشاء صور رمزية مربعة):

\n
package main\n\nimport (\n    "github.com/disintegration/imaging"\n    "log"\n)\n\nfunc main() {\n    src, err :                    

توصيات