go语言学习-笔记4
go image 试验, 生成心形线。
思路: go image 包生成的image数据 -> 转化为html 格式, 通过网页查看图片。
先上脚本(更改数据格式为 -> html)
gofile=$1
htmfile=$2
go build $gofile.go
eval "./$gofile" >> temp_go_jpg.data
if [ -e "$htmfile.html" ]
then
rm $htmfile.html
fi
echo "<img src=\"data:image/png;base64," >> $htmfile.html
sed -i "s/IMAGE://g" temp_go_jpg.data
cat temp_go_jpg.data >> $htmfile.html
echo "\">" >> $htmfile.html
rm temp_go_jpg.data
其中标红的即为替换数据部分.
echo "<img src=\"data:image/png;base64," >> $htmfile.html
sed -i "s/IMAGE://g" temp_go_jpg.data
cat temp_go_jpg.data >> $htmfile.html
echo "\">" >> $htmfile.html
这样假如脚本文件为 gen.sh,go文件为 image.go, 要生成 index.html, 即可以 运行命令 ./gen.sh image index
心形线选择的方程为 : (x2 + y2 - t)3 = x2y3
为了有一点渐变效果, 心型区域着色根据t变化
代码如下:
package main import ( "golang.org/x/tour/pic" "image" "image/color" "math" ) type Image struct { width int } // 计算心形线半径 func (img *Image) CalcHeartRadius(x, y, shift int) float64 { // 心形线方程: (x^2 + y^2 - t)^3 = x^2 * y^3, 求t // 做标轴修正 x = x, y = -y, 方程 (x^2 + y^2 - t)^3 = 0 - x^2 * y^3, 求t // x = x - shift, y = y - shift fx := float64(x) - float64(shift) fy := float64(y) - float64(shift) fValue1 := math.Pow(fx, 2) fCbrt := math.Cbrt(fValue1) * fy ft := math.Pow(fx, 2) + math.Pow(fy, 2) + fCbrt if ft < 0 { return 0 } return math.Sqrt(ft) } func (img *Image) ColorModel() color.Model { return color.RGBAModel } func (img *Image) Bounds() image.Rectangle { return image.Rect(0, 0, img.width, img.width) } func (img *Image) At(x, y int) color.Color { intShift := img.width / 2 radius := img.CalcHeartRadius(x, y, intShift) fmax := float64(intShift)*0.9 if radius > fmax { return color.RGBA{0, 0, 0, 0} } intRadius := uint8(radius) if fmax > 150 { intRadius = uint8(150 * float64(intRadius) / fmax) } return color.RGBA{255-intRadius, 0, 0, 255} } func main() { width := 240 m := Image{width} pic.ShowImage(&m) }
因为go image包中坐标轴方向, y轴方向向下, 即(0,0)点在正方形左上方, 因此要转变方程,替换y为-y, 另外心形中心变为(width/2, width/2), 因此平移方程,x=x-width/2, y = y-wdith/2
生成后,打开html, 查看图像,图片如下: