diff --git a/picture.go b/picture.go
index b1daa7717ff8367565da0f9fa526901040c377aa..bf0334d91faa9abbe1b3d2ff3a181982f6939b3b 100644
--- a/picture.go
+++ b/picture.go
@@ -51,6 +51,38 @@ func NewPicture(img image.Image, smooth bool) *Picture {
 	}
 }
 
+// Image returns the content of the Picture as an image.NRGBA.
+func (p *Picture) Image() *image.NRGBA {
+	bounds := p.Bounds()
+	nrgba := image.NewNRGBA(image.Rect(
+		int(bounds.X()),
+		int(bounds.Y()),
+		int(bounds.X()+bounds.W()),
+		int(bounds.Y()+bounds.H()),
+	))
+
+	mainthread.Call(func() {
+		nrgba.Pix = p.texture.Pixels(
+			int(bounds.X()),
+			int(bounds.Y()),
+			int(bounds.W()),
+			int(bounds.H()),
+		)
+	})
+
+	// flip the image vertically
+	tmp := make([]byte, nrgba.Stride)
+	for i, j := 0, nrgba.Bounds().Dy()-1; i < j; i, j = i+1, j-1 {
+		iSlice := nrgba.Pix[i*nrgba.Stride : (i+1)*nrgba.Stride]
+		jSlice := nrgba.Pix[j*nrgba.Stride : (j+1)*nrgba.Stride]
+		copy(tmp, iSlice)
+		copy(iSlice, jSlice)
+		copy(jSlice, tmp)
+	}
+
+	return nrgba
+}
+
 // Texture returns a pointer to the underlying OpenGL texture of a picture.
 func (p *Picture) Texture() *pixelgl.Texture {
 	return p.texture