مكتبة imaging في Go: تغيير حجم الصور وقصها
في تطوير الويب الحديث، تُعد معالجة الصور من المهام الأساسية: بدءًا من إنشاء الصور المصغرة وصولاً إلى تكييف الصور مع دقة الشاشات المختلفة. إذا كنت تكتب بلغة Go (Golang) وتبحث عن أداة بسيطة لكنها قوية للعمل مع الصور، فانظر إلى مكتبة imaging. فهي توفر واجهة برمجة تطبيقات (API) مريحة لتغيير الأحجام (resize)، والقص (crop)، والتدوير، والتصفية، والعديد من العمليات الأخرى.
ما هي imaging؟
imaging هي مكتبة شائعة في Go، مبنية على حزمة image من المكتبة القياسية، ولكن بواجهة أكثر سهولة. تدعم تنسيقات JPEG و PNG و GIF و BMP، وتتيح تنفيذ العمليات بأقل قدر من الكود. الميزة الرئيسية هي سرعة الأداء وسهولة التكامل.
التثبيت
لتثبيت المكتبة، نفّذ في الطرفية (Terminal):
go get -u github.com/disintegration/imagingبعد ذلك، يمكنك استيرادها في مشروعك:
import "github.com/disintegration/imaging"العمليات الأساسية: تغيير الحجم والقص
1. تغيير الحجم (resize)
تتيح الدالة imaging.Resize تغيير حجم الصورة إلى العرض والارتفاع المحددين. إذا كنت بحاجة إلى الحفاظ على النسب، مرّر 0 لأحد الأبعاد - ستقوم المكتبة تلقائياً بحساب البعد الآخر.
مثال: تغيير الحجم إلى 300 بكسل في العرض
package main
import ( "github.com/disintegration/imaging")
func main() { // فتح الصورة img, err := imaging.Open("input.jpg") if err != nil { panic(err) }
// تغيير العرض إلى 300 بكسل، الارتفاع يتكيف تلقائياً resized := imaging.Resize(img, 300, 0, imaging.Lanczos)
// حفظ النتيجة err = imaging.Save(resized, "output_resized.jpg") if err != nil { panic(err) }}في المثال، تم استخدام المرشح imaging.Lanczos - وهو من أفضل المرشحات لتغيير الحجم. يمكنك اختيار مرشحات أخرى مثل: NearestNeighbor، Box، Linear، Gaussian وغيرها.
2. القص (crop)
تقوم الدالة imaging.Crop بقص منطقة مستطيلة من الصورة. يجب تمرير إحداثيات الزاوية العلوية اليسرى، وعرض وارتفاع المنطقة.
مثال: قص الجزء المركزي بحجم 200x200 بكسل
package main
import ( "github.com/disintegration/imaging")
func main() { img, err := imaging.Open("input.jpg") if err != nil { panic(err) }
// حساب الإحداثيات للقص المركزي width := img.Bounds().Dx() height := img.Bounds().Dy() x := (width - 200) / 2 y := (height - 200) / 2
// القص cropped := imaging.Crop(img, imaging.Rect(x, y, x+200, y+200))
err = imaging.Save(cropped, "output_cropped.jpg") if err != nil { panic(err) }}إذا كنت بحاجة فقط إلى قص الصورة إلى مربع من المنتصف، استخدم imaging.CropCenter:
croppedCenter := imaging.CropCenter(img, 200, 200)الإمكانيات المتقدمة
بالإضافة إلى العمليات الأساسية، تقدم imaging:
- Thumbnail - إنشاء صورة مصغرة مع الحفاظ على النسب وتعبئة الخلفية.
- Rotate - التدوير بزاوية مخصصة.
- Flip - عكس الصورة أفقياً أو عمودياً.
- Blur - تعتيم الصورة.
- Sharpen - زيادة الحدة.
- Grayscale - التحويل إلى تنسيق أبيض وأسود.
مثال: إنشاء صورة مصغرة بحجم 150x150
أيضاً في المكتبة
توصيات