Want to take your software engineering career to the next level? Join the mailing list for career tips & advice Click here


Go Graphics - 2D rendering in Go with a simple API.

Subscribe to updates I use gg

Statistics on gg

Number of watchers on Github 1239
Number of open issues 10
Average time to close an issue about 7 hours
Main language Go
Average time to merge a PR about 6 hours
Open pull requests 6+
Closed pull requests 2+
Last commit over 2 years ago
Repo Created almost 5 years ago
Repo Last Updated over 2 years ago
Size 589 KB
Homepage https://godoc.org...
Organization / Authorfogleman
Page Updated
Do you use gg? Leave a review!
View open issues (10)
View gg activity
View on github
Book a Mock Interview With Me (Silicon Valley Engineering Leader, 100s of interviews conducted)
Software engineers: It's time to get promoted. Starting NOW! Subscribe to my mailing list and I will equip you with tools, tips and actionable advice to grow in your career.
Evaluating gg for your project? Score Explanation
Commits Score (?)
Issues & PR Score (?)

Go Graphics

gg is a library for rendering 2D graphics in pure Go.



go get -u github.com/fogleman/gg

Alternatively, you may use gopkg.in to grab a specific major-version:

go get -u gopkg.in/fogleman/gg.v1



Hello, Circle!

Look how easy!

package main

import "github.com/fogleman/gg"

func main() {
    dc := gg.NewContext(1000, 1000)
    dc.DrawCircle(500, 500, 400)
    dc.SetRGB(0, 0, 0)


There are lots of examples included. They're mostly for testing the code, but they're good for learning, too.


Creating Contexts

There are a few ways of creating a context.

NewContext(width, height int) *Context
NewContextForImage(im image.Image) *Context
NewContextForRGBA(im *image.RGBA) *Context

Drawing Functions

Ever used a graphics library that didn't have functions for drawing rectangles or circles? What a pain!

DrawPoint(x, y, r float64)
DrawLine(x1, y1, x2, y2 float64)
DrawRectangle(x, y, w, h float64)
DrawRoundedRectangle(x, y, w, h, r float64)
DrawCircle(x, y, r float64)
DrawArc(x, y, r, angle1, angle2 float64)
DrawEllipse(x, y, rx, ry float64)
DrawEllipticalArc(x, y, rx, ry, angle1, angle2 float64)
DrawRegularPolygon(n int, x, y, r, rotation float64)
DrawImage(im image.Image, x, y int)
DrawImageAnchored(im image.Image, x, y int, ax, ay float64)
SetPixel(x, y int)

MoveTo(x, y float64)
LineTo(x, y float64)
QuadraticTo(x1, y1, x2, y2 float64)
CubicTo(x1, y1, x2, y2, x3, y3 float64)


It is often desired to center an image at a point. Use DrawImageAnchored with ax and ay set to 0.5 to do this. Use 0 to left or top align. Use 1 to right or bottom align. DrawStringAnchored does the same for text, so you don't need to call MeasureString yourself.

Text Functions

It will even do word wrap for you!

DrawString(s string, x, y float64)
DrawStringAnchored(s string, x, y, ax, ay float64)
DrawStringWrapped(s string, x, y, ax, ay, width, lineSpacing float64, align Align)
MeasureString(s string) (w, h float64)
WordWrap(s string, w float64) []string
SetFontFace(fontFace font.Face)
LoadFontFace(path string, points float64) error

Color Functions

Colors can be set in several different ways for your convenience.

SetRGB(r, g, b float64)
SetRGBA(r, g, b, a float64)
SetRGB255(r, g, b int)
SetRGBA255(r, g, b, a int)
SetColor(c color.Color)
SetHexColor(x string)

Stroke & Fill Options

SetLineWidth(lineWidth float64)
SetLineCap(lineCap LineCap)
SetLineJoin(lineJoin LineJoin)
SetDash(dashes ...float64)
SetFillRule(fillRule FillRule)

Gradients & Patterns

gg supports linear and radial gradients and surface patterns. You can also implement your own patterns.

SetFillStyle(pattern Pattern)
SetStrokeStyle(pattern Pattern)
NewSolidPattern(color color.Color)
NewLinearGradient(x0, y0, x1, y1 float64)
NewRadialGradient(x0, y0, r0, x1, y1, r1 float64)
NewSurfacePattern(im image.Image, op RepeatOp)

Transformation Functions

Translate(x, y float64)
Scale(x, y float64)
Rotate(angle float64)
Shear(x, y float64)
ScaleAbout(sx, sy, x, y float64)
RotateAbout(angle, x, y float64)
ShearAbout(sx, sy, x, y float64)
TransformPoint(x, y float64) (tx, ty float64)

It is often desired to rotate or scale about a point that is not the origin. The functions RotateAbout, ScaleAbout, ShearAbout are provided as a convenience.

InvertY is provided in case Y should increase from bottom to top vs. the default top to bottom.

Stack Functions

Save and restore the state of the context. These can be nested.


Clipping Functions

Use clipping regions to restrict drawing operations to an area that you defined using paths.


Helper Functions

Sometimes you just don't want to write these yourself.

Radians(degrees float64) float64
Degrees(radians float64) float64
LoadImage(path string) (image.Image, error)
LoadPNG(path string) (image.Image, error)
SavePNG(path string, im image.Image) error


Another Example

See the output of this example below.

package main

import "github.com/fogleman/gg"

func main() {
    const S = 1024
    dc := gg.NewContext(S, S)
    dc.SetRGBA(0, 0, 0, 0.1)
    for i := 0; i < 360; i += 15 {
        dc.RotateAbout(gg.Radians(float64(i)), S/2, S/2)
        dc.DrawEllipse(S/2, S/2, S*7/16, S/8)


gg open issues Ask a question     (View All Issues)
  • over 4 years LoadFontFace returns only error, method for saving/reusing a font?
  • over 4 years emoji text not drawn. Is there an option for supporting emojis?
gg open pull requests (View All Pulls)
  • parseHexColor: check length exclusively (and add unit test for it)
  • Implement pattern and gradient
  • Draw image/text with current transformation appied
  • Add a context fontHeight getter
  • Restore previous state in Context.Pop()
  • Return alpha-premultiplied color in gradient interpolation
gg questions on Stackoverflow (View All Questions)
  • unrecognized selector "fetchTokenWithAuthorizedEntity:scope:keyPair:options:handler:" in GG Cloud Messaging
  • Get reCaptcha GG without library reCaptcha in zf2
  • Get date in Italian Format as "Lunedì GG/MM" how to?
  • Vim: gg=G aligns left, does not auto-indent
  • plot rectangles with gg polygon R
  • Vim formatting using gg=G with xml
  • Command gg=G (to indent lines) has no effect in vi[m] on Linux RH
  • Faceted parallell coordinate (gg)plots post ggpcp
  • Multiple Transactions per message on ActiveMQ VIA Oracle GG replication
  • How to run "gg=G" on several files?
  • How do I execute command similar to gg=G in Vim without going to the top of the file?
  • how to get the same result of smartindent after :%left and gg=G
  • How to find Percent Frequency gg plot
  • LIKE % XX(YY)GG % not working in MySQL
  • Make gg=G work in Evil-Mode to indent whole buffer?
  • PHP simple HTML DOM parser for GG site
  • How to implement distributed task executed on GG Node against segment of the IMDB located on it?
  • Can The same GG node serves both roles: IMDB and Compute?
  • Can not start GG node (rev 6) in Windows 7 (works fine for rev 5.3.3)
  • Which config file to use for each GG example
  • How can I get gg=G in vim to ignore a comma?
  • gg plot error bars positioning
  • How to type in a symbol looks like \gg but has larger openning angle in latex?
  • vim gg=G html and jinja2
  • How to use gg=G command in VIM for Windows on XML files from the gui?
  • How do I get back to where I was before after hitting gg in Vim?
gg list of languages used
Other projects in Go
Powered by Autocode - Instant Webhooks, Scripts and APIs
Autocode logo wordmark