العمل مع الصور في Go (Golang): من الأساسيات إلى الأدوات المتقدمة
توفر لغة Go (Golang) أدوات مدمجة قوية للعمل مع الرسومات النقطية، بالإضافة إلى نظام بيئي غني من المكتبات الخارجية. في هذه المقالة، سنستعرض الحزم القياسية image وimage/color وimage/draw وimage/png، بالإضافة إلى المكتبات الشائعة imaging وresize وgg لحل المهام النمطية: التحميل، تغيير الحجم، التراكب، الرسم، وحفظ الصور.
الحزم القياسية في Go للعمل مع الصور
تحتوي المكتبة القياسية للغة Go على أنواع ووظائف أساسية للعمل مع الصور، والتي تغطي 80% من المهام اليومية.
- image — تحدد واجهة
Imageوالأنواع المحددة:RGBA،NRGBA،Gray،Palettedوغيرها. - image/color — تصف الألوان ونماذج الألوان (
Color،RGBA،NRGBA،Gray). - image/draw — توفر خوارزميات الرسم وتراكب الصور (Porter-Duff compositing).
- image/png، image/jpeg، image/gif — برامج ترميز لقراءة/كتابة التنسيقات المقابلة.
مثال 1: إنشاء وحفظ PNG مع تدرج لوني
package main
import ( "image" "image/color" "image/png" "os")
func main() { // إنشاء صورة RGBA جديدة بحجم 200x200 width, height := 200, 200 img := image.NewRGBA(image.Rect(0, 0, width, height))
// ملء البكسلات بتدرج لوني من الأحمر إلى الأزرق for y := 0; y < height; y++ { for x := 0; x < width; x++ { // معامل من 0 إلى 1 ratio := float64(x) / float64(width) r := uint8(255 * (1 - ratio)) b := uint8(255 * ratio) g := uint8(128) img.Set(x, y, color.RGBA{r, g, b, 255}) } }
// حفظ في ملف f, _ := os.Create("gradient.png") defer f.Close() png.Encode(f, img)}مثال 2: تحميل JPEG وتراكب نص (عبر image/draw)
package main
import ( "image" "image/color" "image/draw" "image/jpeg" "image/png" "os")
func main() { // فتح الصورة الأصلية srcFile, _ := os.Open("input.jpg") defer srcFile.Close() src, _, _ := image.Decode(srcFile)
// إنشاء نسخة بتنسيق RGBA لإمكانية الرسم bounds := src.Bounds() dst := image.NewRGBA(bounds) draw.Draw(dst, bounds, src, bounds.Min, draw.Src)
// رسم مستطيل أحمر في الزاوية العلوية اليسرى redRect := image.NewUniform(color.RGBA{255, 0, 0, 200}) rect := image.Rect(10, 10, 150, 80) draw.Draw(dst, rect, redRect, image.Point{}, draw.Over)
// حفظ النتيجة outFile, _ := os.Create("output.png") defer outFile.Close() png.Encode(outFile, dst)}مكتبة imaging: معالجة عالية المستوى
imaging (github.com/disintegration/imaging) هي مكتبة شائعة توفر واجهة برمجة تطبيقات (API) مريحة للعمليات الأكثر شيوعًا: تغيير الحجم، القص، التدوير، تطبيق المرشحات، والتحويل.
imaging.Open()— تحميل صورة من ملف.imaging.Resize()— تغيير الحجم مع الحفاظ على النسب.imaging.Fit()— تكييف الصورة لتناسب مستطيلًا معينًا.imaging.Fill()— قص وتغيير الحجم إلى حجم دقيق.imaging.Rotate()— التدوير بزاوية معينة.imaging.Blur()،imaging.Sharpen()— المرشحات.