《Go語言從入門到精通》Go語言進行繪圖和圖像處理_第1頁
《Go語言從入門到精通》Go語言進行繪圖和圖像處理_第2頁
《Go語言從入門到精通》Go語言進行繪圖和圖像處理_第3頁
《Go語言從入門到精通》Go語言進行繪圖和圖像處理_第4頁
《Go語言從入門到精通》Go語言進行繪圖和圖像處理_第5頁
已閱讀5頁,還剩44頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Go語言進行繪圖和圖像處理Go語言從入門到精通掌握Go語言標準庫進行基本繪圖的方法了解用第三方包進行靈活圖形處理的方法01DRAWING02COMPLEX03PROCESStarget目標掌握復雜圖像繪制的方法目錄導航14.1基本的點繪圖Contents計算機繪圖

繪圖最基本的操作就是在圖片上繪制每個點對于計算機繪圖,可以看作是給每個點設置顏色的過程RGBA色彩體系兩重循環(huán)繪制間隔點陣圖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("創(chuàng)建圖像文件時發(fā)生錯誤:%v",

errT.Error())}defer

fileT.Close()

png.Encode(fileT,

imageT)間隔點陣圖效果目錄導航14.2繪制曲線圖Contents間隔距離繪制曲線//

準備繪制的曲線上8個點的數(shù)據(jù)(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}

//

循環(huán)每隔20個點畫一個點,每個點的縱坐標從dataT中獲取for

i

:=

0;

i

<

len(dataT);

i++

{

imageT.Set(i*20,

dataT[i],

colorT)}間隔距離曲線效果縱坐標與一般生活中是相反的循環(huán)繪制線段組成曲線//

準備繪制的曲線上8個點的數(shù)據(jù)(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}

//

循環(huán)畫出

((i-1)*20,

100-dataT[i-1])

(i*20,

100-dataT[i])

之間的線段//

len(dataT)

-

1

條線段//

用整張圖的高度

100

去減每個點的數(shù)值,才能得到計算機中的正確縱坐標for

i

:=

1;

i

<

len(dataT);

i++

{

t.DrawLine(imageT,

(i-1)*20,

100-dataT[i-1],

i*20,

100-dataT[i],

colorT)}連續(xù)曲線效果圖目錄導航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)

}

}根據(jù)是否落在形狀內確定該點顏色效果圖目錄導航14.4實現(xiàn)漸變的填充色Contents根據(jù)與圓心的距離確定某點的顏色//

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

}

//

否則該點在圓形內部(包括邊)

//

此時根據(jù)與圓心距離的遠近確定顏色強度

return

byte(255.0

*

d

/

p.R)}漸變色效果圖目錄導航14.5用第三方庫實現(xiàn)復雜圖形繪制Contents/fogleman/gg包核心代碼-1//

建立一個繪圖環(huán)境,圖片大小為

600×400

像素contextT

:=

gg.NewContext(600,

400)

//

用十六進制方式設置當前顏色contextT.SetHexColor("FFFFFF")

//

用當前顏色來清空整個圖片contextT.Clear()

//

設置線寬為

2

個像素contextT.SetLineWidth(2)

//

設置RGB顏色,每種顏色的數(shù)值范圍是

0.0

-

1.0contextT.SetRGB(0.0,

0.0,

1.0)

//

畫一個圓,以坐標為

(200,

200)

的點為圓心,半徑為

50像素contextT.DrawCircle(250,

250,

60)

//

真正進行線條繪制,并且保留繪圖路徑以便后面填充顏色contextT.StrokePreserve()/fogleman/gg包核心代碼-2//

創(chuàng)建一個漸變色填充方案

gradientT//

是兩點之間的圓環(huán)式漸變色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

的數(shù)值范圍表示顏色和透明度//

設置一定的透明度以便顯示出被覆蓋住的圖形(圓形)contextT.SetRGBA255(0,

255,

0,

180)

//

繪制一個左上角點坐標為

(300,

200),寬

100,高

100的矩形contextT.DrawRectangle(300,

200,

100,

100)

//

僅填充顏色不繪制邊線contextT.Fill()/fogleman/gg包核心代碼-4//

用路徑法畫一個三角形

//

用十六進制字符串設置顏色//

可以加上前面的“#”號,也可以后面加上一個字節(jié)表示透明度contextT.SetHexColor("#FF000099")

//

將虛擬的畫筆移動到坐標為

(300,

120)

的點contextT.MoveTo(300,

120)

//

從當前點繪制一條線到坐標為

(240,

230)的點為止//

當前點將隨之移動到

(240,

230)contextT.LineTo(240,

230)

//

繼續(xù)繪制一條直線到

(360,

230)contextT.LineTo(360,

230)

//

繼續(xù)繪制一條直線到

(300,

120)contextT.LineTo(300,

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

創(chuàng)建一個新的線性漸變色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)

//

設置粗一點的線寬以體現(xiàn)漸變色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("載入黑體字體時發(fā)生錯誤:%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包實現(xiàn)靈活的圖像處理Contents應用廣泛的Draw函數(shù)func

Draw(dst

Image,

r

image.Rectangle,

src

image.Image,

sp

image.Point,

op

Op)將源圖片src中從左上角點開始的大小為與r相同大小的區(qū)域的內容復制畫到目標圖片dst中的r區(qū)域中,并使用op指定的繪制模式實現(xiàn)圖片區(qū)域復制(及粘貼)draw.Draw(originalImage2T.(draw.Image),

image.Rect(380,

30,

580,

230),

originalImage1T,

image.Point{200,

30},

draw.Src)用draw.Draw函數(shù)進行顏色填充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)復制原圖中的區(qū)域到目標圖中另一個區(qū)域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)

使用蒙版復制不規(guī)則區(qū)域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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論