《Go语言从入门到精通》Go语言进行绘图和图像处理_第1页
《Go语言从入门到精通》Go语言进行绘图和图像处理_第2页
《Go语言从入门到精通》Go语言进行绘图和图像处理_第3页
《Go语言从入门到精通》Go语言进行绘图和图像处理_第4页
《Go语言从入门到精通》Go语言进行绘图和图像处理_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Go语言进行绘图和图像处理Go语言从入门到精通掌握Go语言标准库进行基本绘图的方法了解用第三方包进行灵活图形处理的方法01DRAWING02COMPLEX03PROCESStarget目标掌握复杂图像绘制的方法目录导航14.1基本的点绘图Contents计算机绘图

绘图最基本的操作就是在图片上绘制每个点对于计算机绘图,可以看作是给每个点设置颜色的过程RGBA色彩体系两重循环绘制间隔点阵图imageT

:=

image.NewNRGBA(image.Rect(0,

0,

100,

100))

//

设置画点所需的色彩,这里设置的是纯红色colorT

:=

color.RGBA{0xFF,

0x00,

0x00,

0xFF}

for

i

:=

0;

i

<

100;

i

=

i

+

2

{

for

j

:=

0;

j

<

100;

j

=

j

+

2

{

imageT.Set(int(j),

int(i),

colorT)

}}

fileT,

errT

:=

os.Create(`c:\test\test.png`)if

errT

!=

nil

{

t.Printfln("创建图像文件时发生错误:%v",

errT.Error())}defer

fileT.Close()

png.Encode(fileT,

imageT)间隔点阵图效果目录导航14.2绘制曲线图Contents间隔距离绘制曲线//

准备绘制的曲线上8个点的数据(y坐标)dataT

:=

[]int{10,

20,

50,

80,

60,

20,

10,

10}

//

新建一个NRGBA颜色体系的图片//

图片大小为

200

*

100,

即宽度为200,高度是100个像素imageT

:=

image.NewNRGBA(image.Rect(0,

0,

200,

100))

//

设置画点所需的色彩,这里设置的是纯红色colorT

:=

color.RGBA{0xFF,

0x00,

0x00,

0xFF}

//

循环每隔20个点画一个点,每个点的纵坐标从dataT中获取for

i

:=

0;

i

<

len(dataT);

i++

{

imageT.Set(i*20,

dataT[i],

colorT)}间隔距离曲线效果纵坐标与一般生活中是相反的循环绘制线段组成曲线//

准备绘制的曲线上8个点的数据(y坐标)dataT

:=

[]int{10,

20,

50,

80,

60,

20,

10,

10}

//

新建一个NRGBA颜色体系的图片//

图片大小为

200

*

100,

即宽度为200,高度是100个像素imageT

:=

image.NewNRGBA(image.Rect(0,

0,

200,

100))

//

设置画点所需的色彩,这里设置的是纯红色colorT

:=

color.RGBA{0xFF,

0x00,

0x00,

0xFF}

//

循环画出

((i-1)*20,

100-dataT[i-1])

(i*20,

100-dataT[i])

之间的线段//

len(dataT)

-

1

条线段//

用整张图的高度

100

去减每个点的数值,才能得到计算机中的正确纵坐标for

i

:=

1;

i

<

len(dataT);

i++

{

t.DrawLine(imageT,

(i-1)*20,

100-dataT[i-1],

i*20,

100-dataT[i],

colorT)}连续曲线效果图目录导航14.3绘制有填充色的形状Contents核心代码

var

w,

h

int

=

600,

400

var

hw,

hh

float64

=

float64(w

/

2),

float64(h

/

2)

r

:=

80.0

θ

:=

math.Pi

*

2

/

3

shapeRedT

:=

&Triangle{hw

-

r*math.Sin(0)

+

90*0.1,

hh

-

r*math.Cos(0)

+

90*0.3,

90

*

1.18}

imageT

:=

image.NewRGBA(image.Rect(0,

0,

w,

h))

for

y

:=

0;

y

<

h;

y++

{

for

x

:=

0;

x

<

w;

x++

{

var

colorRedT

byte

=

0

if

shapeRedT.InShape(float64(x),

float64(y))

{

colorRedT

=

255

} ……

colorT

:=

color.RGBA{colorRedT,

colorGreenT,

colorBlueT,

255}

imageT.Set(x,

y,

colorT)

}

}根据是否落在形状内确定该点颜色效果图目录导航14.4实现渐变的填充色Contents根据与圆心的距离确定某点的颜色//

GetColorValue

确定坐标为

(x,

y)

的点的色彩func

(p

*Circle)

GetColorValue(x,

y

float64)

byte

{

//

计算该点与圆心的相对坐标

(dx,

dy)

//

注意这种同时给两个变量赋值的方法

var

dx,

dy

float64

=

p.X0

-

x,

p.Y0

-

y

//

计算该点与圆心的距离

d

d

:=

math.Sqrt(dx*dx

+

dy*dy)

if

d

>

p.R

{

//

如果

距离

d

大于半径,则该点一定在圆形之外

//

返回0值,表示没有该种色调

return

0

}

//

否则该点在圆形内部(包括边)

//

此时根据与圆心距离的远近确定颜色强度

return

byte(255.0

*

d

/

p.R)}渐变色效果图目录导航14.5用第三方库实现复杂图形绘制Contents/fogleman/gg包核心代码-1//

建立一个绘图环境,图片大小为

600×400

像素contextT

:=

gg.NewContext(600,

400)

//

用十六进制方式设置当前颜色contextT.SetHexColor("FFFFFF")

//

用当前颜色来清空整个图片contextT.Clear()

//

设置线宽为

2

个像素contextT.SetLineWidth(2)

//

设置RGB颜色,每种颜色的数值范围是

0.0

-

1.0contextT.SetRGB(0.0,

0.0,

1.0)

//

画一个圆,以坐标为

(200,

200)

的点为圆心,半径为

50像素contextT.DrawCircle(250,

250,

60)

//

真正进行线条绘制,并且保留绘图路径以便后面填充颜色contextT.StrokePreserve()/fogleman/gg包核心代码-2//

创建一个渐变色填充方案

gradientT//

是两点之间的圆环式渐变色gradientT

:=

gg.NewRadialGradient(250,

250,

0,

250,

250,

80)gradientT.AddColorStop(0,

color.RGBA{0,

0,

0,

255})gradientT.AddColorStop(1,

color.RGBA{0,

0,

255,

255})

//

设置用渐变色

gradientT

填充contextT.SetFillStyle(gradientT)

//

真正进行填充,并清除绘画路径contextT.Fill()/fogleman/gg包核心代码-3//

用填充的方式绘制一个矩形

//

用RGBA色彩体系设置当前颜色//

0

-

255

的数值范围表示颜色和透明度//

设置一定的透明度以便显示出被覆盖住的图形(圆形)contextT.SetRGBA255(0,

255,

0,

180)

//

绘制一个左上角点坐标为

(300,

200),宽

100,高

100的矩形contextT.DrawRectangle(300,

200,

100,

100)

//

仅填充颜色不绘制边线contextT.Fill()/fogleman/gg包核心代码-4//

用路径法画一个三角形

//

用十六进制字符串设置颜色//

可以加上前面的“#”号,也可以后面加上一个字节表示透明度contextT.SetHexColor("#FF000099")

//

将虚拟的画笔移动到坐标为

(300,

120)

的点contextT.MoveTo(300,

120)

//

从当前点绘制一条线到坐标为

(240,

230)的点为止//

当前点将随之移动到

(240,

230)contextT.LineTo(240,

230)

//

继续绘制一条直线到

(360,

230)contextT.LineTo(360,

230)

//

继续绘制一条直线到

(300,

120)contextT.LineTo(300,

120)/fogleman/gg包核心代码-5//

创建一个新的线性渐变色gradientT

=

gg.NewLinearGradient(240,

120,

360,

230)gradientT.AddColorStop(0,

color.RGBA{0,

255,

0,

255})gradientT.AddColorStop(1,

color.RGBA{0,

0,

255,

255})gradientT.AddColorStop(0.5,

color.RGBA{255,

0,

0,

255})

//

渐变色也可以用于线条颜色的渐变contextT.SetStrokeStyle(gradientT)

//

设置粗一点的线宽以体现渐变色contextT.SetLineWidth(10)

//

真正绘制三角形contextT.Stroke()

//

保存图像为PNG格式的图片文件contextT.SavePNG(`c:\test\gg.png`)gg包效果图目录导航14.6绘制平滑曲线Contents三次贝塞尔曲线法增加控制点来生平滑曲线贝塞尔曲线目录导航14.7在图片上绘制文字Contents在图片上绘制文字fontFaceT,

errT

:=

gg.LoadFontFace("C:\\Windows\\Fonts\\simhei.ttf",

22)

if

errT

!=

nil

{

fmt.Printf("载入黑体字体时发生错误:%v",

errT.Error())

return}

contextT.SetFontFace(fontFaceT)contextT.SetHexColor("EEEEEE")

contextT.DrawStringAnchored(fmt.Sprintf("平滑曲线图

%v×%v",

600,

400),

480,

50,

0.5,

0.5)

contextT.Stroke()在图片上绘制文字效果图目录导航14.8使用freetype包进行文字绘制Contents用/golang/freetype包绘制文字fontT,

_

:=

freetype.ParseFont(fontBytesT)foreColorT

:=

image.White

fontSizeT

:=

28.0

contextT

:=

freetype.NewContext()contextT.SetDPI(72)contextT.SetFont(fontT)contextT.SetFontSize(fontSizeT)contextT.SetClip(imageT.Bounds())contextT.SetDst(imageT)contextT.SetSrc(foreColorT)pt

:=

freetype.Pt(10,

10+int(contextT.PointToFixed(fontSizeT)>>6))

for

_,

s

:=

range

textT

{

contextT.DrawString(s,

pt)

pt.Y

+=

contextT.PointToFixed(fontSizeT

*

1.5)}用/golang/freetype包绘制文字效果图目录导航14.9用image/draw包实现灵活的图像处理Contents应用广泛的Draw函数func

Draw(dst

Image,

r

image.Rectangle,

src

image.Image,

sp

image.Point,

op

Op)将源图片src中从左上角点开始的大小为与r相同大小的区域的内容复制画到目标图片dst中的r区域中,并使用op指定的绘制模式实现图片区域复制(及粘贴)draw.Draw(originalImage2T.(draw.Image),

image.Rect(380,

30,

580,

230),

originalImage1T,

image.Point{200,

30},

draw.Src)用draw.Draw函数进行颜色填充imageT

:=

image.NewNRGBA(image.Rect(0,

0,

480,

320))

colorT

:=

color.RGBA{255,

0,

0,

255}

draw.Draw(imageT,

imageT.Bounds(),

&image.Uniform{colorT},

image.ZP,

draw.Src)image包中的重要对象image.Imageimage.NRGBAimage.RGBAimage.Rectangle

用颜色填充绘制矩形框imageT

:=

image.NewNRGBA(image.Rect(0,

0,

480,

320))

colorT

:=

color.RGBA{255,

0,

0,

255}

draw.Draw(imageT,

imageT.Bounds(),

&image.Uniform{colorT},

image.ZP,

draw.Src)

draw.Draw(imageT,

image.Rect(10,

10,

470,

310),

image.Rect(10,

10,

470,

310),

image.Point{10,

10},

draw.Src)将图片变成全透明draw.Draw(imageT,

imageT.Bounds(),

image.Transparent,

image.ZP,

draw.Src)复制原图中的区域到目标图中另一个区域sourcePointT

:=

image.Pt(300,

400)rSrc

:=

image.Rectangle{sourcePointT,

sourcePointT.Add(image.Pt(200,

180))}

draw.Draw(imageDstT,

rSrc,

image.Black,

image.Pt(100,

50),

draw.Src)

使用蒙版复制不规则区域draw.DrawMask(dstImageT,

dstImageT.Bounds(),

srcImageT,

image.ZP,

maskT,

image.ZP,

draw.Over)自定义image.Image类型的蒙版对象type

TwoCircleMask

struct

{

W,

H

int

X0,

Y0,

X1,

Y1

float64

R

float64}

func

(p

*TwoCircleMask)

ColorModel()

color.Model

{

return

color.AlphaModel}

func

(p

*TwoCircleMask)

Bounds()

image.Rectangle

{

return

image.Rect(0,

0,

p.W,

p.H)}

func

(p

*TwoCircleMask)

At(x,

y

int)

color.Color

{

var

dx1,

dy1

float64

=

p.X0

-

float64(x),

p.Y0

-

float64(y)

var

dx2,

dy2

float64

=

p.X1

-

float64(x),

p.Y1

-

float64(y)

d1

:=

math.Sqrt(dx1*dx1

+

dy1*dy1)

d2

:=

math.Sqrt(dx2*dx2

+

dy

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论