版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年撰寫:中國乙酰溴αD葡萄糖行業(yè)發(fā)展趨勢及競爭調(diào)研分析報(bào)告
- 2024-2030年安胃得公司技術(shù)改造及擴(kuò)產(chǎn)項(xiàng)目可行性研究報(bào)告
- 2024-2030年多層共擠分配器公司技術(shù)改造及擴(kuò)產(chǎn)項(xiàng)目可行性研究報(bào)告
- 2024-2030年全球香檳行業(yè)營銷態(tài)勢及銷售效益預(yù)測報(bào)告
- 2024-2030年全球及中國間溴苯甲醚市場需求前景及發(fā)展趨勢預(yù)測報(bào)告
- 2024-2030年全球及中國藥檢口服液行業(yè)競爭格局及需求前景預(yù)測報(bào)告
- 2024-2030年全球及中國納米石墨烯材料行業(yè)供需態(tài)勢及盈利前景預(yù)測報(bào)告
- 2024-2030年全球及中國廚電維修與保養(yǎng)服務(wù)行業(yè)發(fā)展前景及未來需求趨勢預(yù)測報(bào)告
- 2024-2030年全球及中國全自動(dòng)探針臺(tái)行業(yè)發(fā)展動(dòng)態(tài)及前景規(guī)劃分析報(bào)告
- 2024-2030年全球及中國乙烯基硅油行業(yè)運(yùn)營狀況及發(fā)展前景預(yù)測報(bào)告
- JJ∕G(交通) 200-2024 輪碾成型機(jī)
- 小學(xué)六年級(jí)奧數(shù)難題100道及答案(完整版)
- 小學(xué)科學(xué)教科版五年級(jí)上冊全冊易錯(cuò)知識(shí)點(diǎn)專項(xiàng)練習(xí)(判斷選擇-分單元編排-附參考答案和點(diǎn)撥)
- 電影作品解讀-世界科幻電影智慧樹知到期末考試答案章節(jié)答案2024年成都錦城學(xué)院
- NB-T47003.1-2009鋼制焊接常壓容器(同JB-T4735.1-2009)
- 聚焦高質(zhì)量+探索新高度+-2025屆高考政治復(fù)習(xí)備考策略
- 惠州市惠城區(qū)2022-2023學(xué)年七年級(jí)上學(xué)期期末教學(xué)質(zhì)量檢測數(shù)學(xué)試卷
- 北京市西城區(qū)2022-2023學(xué)年七年級(jí)上學(xué)期期末英語試題【帶答案】
- ISO45001-2018職業(yè)健康安全管理體系之5-4:“5 領(lǐng)導(dǎo)作用和工作人員參與-5.4 工作人員的協(xié)商和參與”解讀和應(yīng)用指導(dǎo)材料(2024A0-雷澤佳)
- 看圖猜成語共876道題目動(dòng)畫版
- 小學(xué)二年級(jí)上冊數(shù)學(xué)-數(shù)角的個(gè)數(shù)專項(xiàng)練習(xí)
評(píng)論
0/150
提交評(píng)論