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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Go語言進(jìn)行繪圖和圖像處理Go語言從入門到精通掌握Go語言標(biāo)準(zhǔn)庫進(jìn)行基本繪圖的方法了解用第三方包進(jìn)行靈活圖形處理的方法01DRAWING02COMPLEX03PROCESStarget目標(biāo)掌握復(fù)雜圖像繪制的方法目錄導(dǎo)航14.1基本的點(diǎn)繪圖Contents計(jì)算機(jī)繪圖

繪圖最基本的操作就是在圖片上繪制每個(gè)點(diǎn)對(duì)于計(jì)算機(jī)繪圖,可以看作是給每個(gè)點(diǎn)設(shè)置顏色的過程RGBA色彩體系兩重循環(huán)繪制間隔點(diǎn)陣圖imageT

:=

image.NewNRGBA(image.Rect(0,

0,

100,

100))

//

設(shè)置畫點(diǎn)所需的色彩,這里設(shè)置的是純紅色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)建圖像文件時(shí)發(fā)生錯(cuò)誤:%v",

errT.Error())}defer

fileT.Close()

png.Encode(fileT,

imageT)間隔點(diǎn)陣圖效果目錄導(dǎo)航14.2繪制曲線圖Contents間隔距離繪制曲線//

準(zhǔn)備繪制的曲線上8個(gè)點(diǎn)的數(shù)據(jù)(y坐標(biāo))dataT

:=

[]int{10,

20,

50,

80,

60,

20,

10,

10}

//

新建一個(gè)NRGBA顏色體系的圖片//

圖片大小為

200

*

100,

即寬度為200,高度是100個(gè)像素imageT

:=

image.NewNRGBA(image.Rect(0,

0,

200,

100))

//

設(shè)置畫點(diǎn)所需的色彩,這里設(shè)置的是純紅色colorT

:=

color.RGBA{0xFF,

0x00,

0x00,

0xFF}

//

循環(huán)每隔20個(gè)點(diǎn)畫一個(gè)點(diǎn),每個(gè)點(diǎn)的縱坐標(biāo)從dataT中獲取for

i

:=

0;

i

<

len(dataT);

i++

{

imageT.Set(i*20,

dataT[i],

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

準(zhǔn)備繪制的曲線上8個(gè)點(diǎn)的數(shù)據(jù)(y坐標(biāo))dataT

:=

[]int{10,

20,

50,

80,

60,

20,

10,

10}

//

新建一個(gè)NRGBA顏色體系的圖片//

圖片大小為

200

*

100,

即寬度為200,高度是100個(gè)像素imageT

:=

image.NewNRGBA(image.Rect(0,

0,

200,

100))

//

設(shè)置畫點(diǎn)所需的色彩,這里設(shè)置的是純紅色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

去減每個(gè)點(diǎn)的數(shù)值,才能得到計(jì)算機(jī)中的正確縱坐標(biāo)for

i

:=

1;

i

<

len(dataT);

i++

{

t.DrawLine(imageT,

(i-1)*20,

100-dataT[i-1],

i*20,

100-dataT[i],

colorT)}連續(xù)曲線效果圖目錄導(dǎo)航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ù)是否落在形狀內(nèi)確定該點(diǎn)顏色效果圖目錄導(dǎo)航14.4實(shí)現(xiàn)漸變的填充色Contents根據(jù)與圓心的距離確定某點(diǎn)的顏色//

GetColorValue

確定坐標(biāo)為

(x,

y)

的點(diǎn)的色彩func

(p

*Circle)

GetColorValue(x,

y

float64)

byte

{

//

計(jì)算該點(diǎn)與圓心的相對(duì)坐標(biāo)

(dx,

dy)

//

注意這種同時(shí)給兩個(gè)變量賦值的方法

var

dx,

dy

float64

=

p.X0

-

x,

p.Y0

-

y

//

計(jì)算該點(diǎn)與圓心的距離

d

d

:=

math.Sqrt(dx*dx

+

dy*dy)

if

d

>

p.R

{

//

如果

距離

d

大于半徑,則該點(diǎn)一定在圓形之外

//

返回0值,表示沒有該種色調(diào)

return

0

}

//

否則該點(diǎn)在圓形內(nèi)部(包括邊)

//

此時(shí)根據(jù)與圓心距離的遠(yuǎn)近確定顏色強(qiáng)度

return

byte(255.0

*

d

/

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

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

600×400

像素contextT

:=

gg.NewContext(600,

400)

//

用十六進(jìn)制方式設(shè)置當(dāng)前顏色contextT.SetHexColor("FFFFFF")

//

用當(dāng)前顏色來清空整個(gè)圖片contextT.Clear()

//

設(shè)置線寬為

2

個(gè)像素contextT.SetLineWidth(2)

//

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

0.0

-

1.0contextT.SetRGB(0.0,

0.0,

1.0)

//

畫一個(gè)圓,以坐標(biāo)為

(200,

200)

的點(diǎn)為圓心,半徑為

50像素contextT.DrawCircle(250,

250,

60)

//

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

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

gradientT//

是兩點(diǎn)之間的圓環(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})

//

設(shè)置用漸變色

gradientT

填充contextT.SetFillStyle(gradientT)

//

真正進(jìn)行填充,并清除繪畫路徑contextT.Fill()/fogleman/gg包核心代碼-3//

用填充的方式繪制一個(gè)矩形

//

用RGBA色彩體系設(shè)置當(dāng)前顏色//

0

-

255

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

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

255,

0,

180)

//

繪制一個(gè)左上角點(diǎn)坐標(biāo)為

(300,

200),寬

100,高

100的矩形contextT.DrawRectangle(300,

200,

100,

100)

//

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

用路徑法畫一個(gè)三角形

//

用十六進(jìn)制字符串設(shè)置顏色//

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

//

將虛擬的畫筆移動(dòng)到坐標(biāo)為

(300,

120)

的點(diǎn)contextT.MoveTo(300,

120)

//

從當(dāng)前點(diǎn)繪制一條線到坐標(biāo)為

(240,

230)的點(diǎn)為止//

當(dāng)前點(diǎn)將隨之移動(dòng)到

(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)建一個(gè)新的線性漸變色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)

//

設(shè)置粗一點(diǎn)的線寬以體現(xiàn)漸變色contextT.SetLineWidth(10)

//

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

//

保存圖像為PNG格式的圖片文件contextT.SavePNG(`c:\test\gg.png`)gg包效果圖目錄導(dǎo)航14.6繪制平滑曲線Contents三次貝塞爾曲線法增加控制點(diǎn)來生平滑曲線貝塞爾曲線目錄導(dǎo)航14.7在圖片上繪制文字Contents在圖片上繪制文字fontFaceT,

errT

:=

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

22)

if

errT

!=

nil

{

fmt.Printf("載入黑體字體時(shí)發(fā)生錯(cuò)誤:%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()在圖片上繪制文字效果圖目錄導(dǎo)航14.8使用freetype包進(jìn)行文字繪制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包繪制文字效果圖目錄導(dǎo)航14.9用image/draw包實(shí)現(xiàn)靈活的圖像處理Contents應(yīng)用廣泛的Draw函數(shù)func

Draw(dst

Image,

r

image.Rectangle,

src

image.Image,

sp

image.Point,

op

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

image.Rect(380,

30,

580,

230),

originalImage1T,

image.Point{200,

30},

draw.Src)用draw.Draw函數(shù)進(jìn)行顏色填充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包中的重要對(duì)象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)復(fù)制原圖中的區(qū)域到目標(biāo)圖中另一個(gè)區(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)

使用蒙版復(fù)制不規(guī)則區(qū)域draw.DrawMask(dstImageT,

dstImageT.Bounds(),

srcImageT,

image.ZP,

maskT,

image.ZP,

draw.Over)自定義image.Image類型的蒙版對(duì)象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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論