العمل مع الصور بلغة 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
في هذه المقالة، سنركز على مكتبة imaging باعتبارها الأكثر توازنًا من حيث الوظائف وسهولة الاستخدام.
التثبيت
\nللبدء، تحتاج إلى تثبيت المكتبة باستخدام go get:
go get github.com/disintegration/imaging\n\nتغيير حجم الصورة (Resize)
\nتتيح عملية resize تغيير مقياس الصورة إلى أبعاد جديدة. تدعم مكتبة imaging عدة أوضاع:
- \n
- Fit — يلائم الصورة داخل مستطيل محدد مع الحفاظ على النسب. \n
- Fill — يملأ المستطيل، ويقص الحواف عند الضرورة. \n
- Resize — تغيير دقيق إلى العرض والارتفاع المحددين (بدون الحفاظ على النسب). \n
مثال على تغيير الحجم الأساسي مع الحفاظ على النسب (Fit):
\npackage 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
Crop— يقطع منطقة مستطيلة بإحداثيات محددة. \n CropCenter— يقطع المنطقة المركزية بالحجم المحدد. \n
مثال على قص الجزء المركزي (مفيد لإنشاء صور رمزية مربعة):
\npackage main\n\nimport (\n "github.com/disintegration/imaging"\n "log"\n)\n\nfunc main() {\n src, err :