مقدمة في العمل مع الصور بلغة Go
Go (Golang) هي لغة حديثة ومترجمة مع مكتبة قياسية غنية تتضمن حزمة image للعمل الأساسي مع الصور النقطية. ومع ذلك، لمهام القياس والتصفية وتحويل التنسيقات والمعالجة المجمعة، غالبًا ما تكون هناك حاجة إلى مكتبات خارجية. في هذه المقالة، سنستعرض الأدوات الأكثر شيوعًا للعمل مع الصور في Go، ونقدم أمثلة على الكود، ونقارن إمكانياتها.
الحزمة القياسية image
توفر حزمة image من المكتبة القياسية للغة Go الأنواع والوظائف الأساسية لفك الترميز والتشفير ومعالجة الصور. وهي تدعم تنسيقات PNG وJPEG وGIF (فك الترميز فقط). مثال على تحميل صورة من ملف:
package main
import ( "image" "image/jpeg" "os")
func main() { file, err := os.Open("input.jpg") if err != nil { panic(err) } defer file.Close()
img, _, err := image.Decode(file) if err != nil { panic(err) }
// الوصول إلى البكسلات عبر img.At(x, y) _ = img}قيود الحزمة القياسية: عدم وجود وظائف مدمجة لتغيير الحجم والتدوير والتصفية والعمل مع بيانات EXIF. لهذه المهام، استخدم المكتبات الخارجية.
مكتبة imaging
imaging هي واحدة من أشهر المكتبات لمعالجة الصور بلغة Go. توفر واجهة برمجة تطبيقات بسيطة لتغيير الحجم والقص والتدوير وتطبيق المرشحات وتحويل التنسيقات.
التثبيت:
go get github.com/disintegration/imagingمثال على تغيير الحجم مع الحفاظ على النسب:
package main
import ( "github.com/disintegration/imaging" "log")
func main() { src, err := imaging.Open("input.jpg") if err != nil { log.Fatalf("خطأ في الفتح: %v", err) }
// تغيير الحجم إلى عرض 800 بكسل، الارتفاع يتكيف dst := imaging.Resize(src, 800, 0, imaging.Lanczos)
err = imaging.Save(dst, "output.jpg") if err != nil { log.Fatalf("خطأ في الحفظ: %v", err) }}تدعم المكتبة المرشحات: التمويه، الحدة، التباين، السطوع، التدرج الرمادي. مثال على تطبيق مرشح:
grayscaleImg := imaging.Grayscale(src)sharpImg := imaging.Sharpen(src, 0.5)blurImg := imaging.Blur(src, 3.0)المزايا: واجهة برمجة تطبيقات نظيفة، دعم GIF (للقراءة فقط)، الاتجاه التلقائي بناءً على EXIF، وظائف مدمجة للصور المصغرة والمعالجة المجمعة.
مكتبة nfnt/resize
nfnt/resize هي مكتبة متخصصة لتغيير حجم الصور. تقدم عدة خوارزميات للاستيفاء (NearestNeighbor، Bilinear، Bicubic، MitchellNetravali، Lanczos2، Lanczos3).
التثبيت:
go get github.com/nfnt/resizeمثال على تغيير الحجم إلى 200x200 بكسل بالضبط:
package main
import ( "image/jpeg" "os" "github.com/nfnt/resize")
func main() { file, _ := os.Open("input.jpg") defer file.Close() img, _ := jpeg.Decode(file)
// تغيير الحجم إلى 200x200 newImg := resize.Resize(200, 200, img, resize.Lanczos3)
out, _ := os.Create("resized.jpg") defer out.Close() jpeg.Encode(out, newImg, nil)}الخصائص: تعمل المكتبة فقط مع الصور التي تطبق واجهة image.Image. لا تدعم قراءة/كتابة الملفات مباشرة - يتطلب فك الترميز/الترميز يدويًا.