العمل مع الصور في Go (Golang): image، draw، imaging، resize

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع الصور في 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() — المرشحات.


مثال 3: تغيير الحجم باستخدام

توصيات