العمل مع الصور في Go (Golang): نظرة عامة على المكتبات وأمثلة عملية
Go (Golang) هي لغة مترجمة وثابتة الأنواع تكتسب شعبية في تطوير الويب والخدمات المصغرة ومهام معالجة البيانات. على عكس Python، حيث تُستخدم OpenCV أو Pillow تقليديًا للعمل مع الصور، في Go توجد عدة مكتبات خفيفة وسريعة تسمح بإجراء العمليات الأساسية على الرسومات النقطية: تغيير الحجم، القص، التدوير، تطبيق الفلاتر، والرسم.
في هذه المقالة، سنستعرض ثلاث مكتبات شائعة للعمل مع الصور بلغة Go: imaging و nfnt/resize و gg. ستتعلم كيفية تثبيتها وسترى أمثلة كود للمهام النموذجية.
1. مكتبة imaging
imaging هي مكتبة بسيطة لكنها قوية لمعالجة الصور. توفر دوال مريحة لتغيير الحجم، القص، التدوير، تطبيق الفلاتر (التمويه، الحدة، عكس الألوان) والحفظ بتنسيقات مختلفة (JPEG، PNG، GIF، BMP).
التثبيت
go get -u github.com/disintegration/imagingمثال: تغيير الحجم والقص
package main
import ( "fmt" "github.com/disintegration/imaging" "log")
func main() { // فتح الصورة src, err := imaging.Open("input.jpg") if err != nil { log.Fatalf("خطأ في فتح الملف: %v", err) }
// تغيير الحجم إلى 800x600 مع الحفاظ على النسبة dst := imaging.Resize(src, 800, 600, imaging.Lanczos) // قص المنطقة المركزية 400x400 dst = imaging.CropCenter(dst, 400, 400)
// تطبيق فلتر التمويه dst = imaging.Blur(dst, 3.0)
// حفظ النتيجة err = imaging.Save(dst, "output.jpg") if err != nil { log.Fatalf("خطأ في الحفظ: %v", err) } fmt.Println("تمت معالجة الصورة وحفظها كـ output.jpg")}تدعم المكتبة العديد من الفلاتر: imaging.Grayscale، imaging.Invert، imaging.Contrast، imaging.Sharpen وغيرها. جميعها تعمل "جاهزة للاستخدام".
2. مكتبة nfnt/resize
إذا كانت مهمتك هي فقط تغيير حجم الصور بأقصى أداء، فإن nfnt/resize هي الخيار الأفضل. تم تحسينها للمعالجة عالية السرعة وتدعم خوارزميات استيفاء مختلفة (NearestNeighbor، Bilinear، Bicubic، Lanczos2، Lanczos3).
التثبيت
go get -u github.com/nfnt/resizeمثال: تغيير الحجم بخوارزميات مختلفة
package main
import ( "image" "image/jpeg" "log" "os" "github.com/nfnt/resize")
func main() { file, err := os.Open("input.jpg") if err != nil { log.Fatal(err) } defer file.Close()
img, _, err := image.Decode(file) if err != nil { log.Fatal(err) }
// تغيير الحجم إلى عرض 300 بكسل، الارتفاع يُحسب تلقائيًا m := resize.Resize(300, 0, img, resize.Lanczos3)
out, err := os.Create("resized.jpg") if err != nil { log.Fatal(err) } defer out.Close()
// الحفظ بجودة JPEG 90% err = jpeg.Encode(out, m, &jpeg.Options{Quality: 90}) if err != nil { log.Fatal(err) } log.Println("تم تصغير الصورة إلى عرض 300px")}هذه المكتبة لا توفر دوال للقص أو الفلاتر، لكن سرعتها وبساطتها تجعلها مثالية للخوادم التي تحتاج لمعالجة آلاف الصور في الثانية.
3. مكتبة gg (الرسم)
gg هي مكتبة لرسم الرسومات ثنائية الأبعاد، تشبه cairo أو Pillow Draw. تسمح بإنشاء الصور