Skip to content

Commit eaa23de

Browse files
committed
feat: import imgfactory files
1 parent 2e45866 commit eaa23de

18 files changed

Lines changed: 806 additions & 38 deletions

color.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,21 @@ import (
88
"unsafe"
99
)
1010

11+
var (
12+
White = color.RGBA{255, 255, 255, 255}
13+
Black = color.RGBA{0, 0, 0, 255}
14+
Red = color.RGBA{255, 0, 0, 255}
15+
Green = color.RGBA{0, 255, 0, 255}
16+
Blue = color.RGBA{0, 0, 255, 255}
17+
Yellow = color.RGBA{255, 255, 0, 255}
18+
Cyan = color.RGBA{0, 255, 255, 255}
19+
Magenta = color.RGBA{255, 0, 255, 255}
20+
Grey = color.RGBA{190, 190, 190, 255}
21+
Pink = color.RGBA{255, 181, 197, 255}
22+
Orange = color.RGBA{255, 165, 0, 255}
23+
Opaque = color.RGBA{0, 0, 0, 0}
24+
)
25+
1126
// takecolor 实现基于k-means算法的图像取色算法
1227
func takecolor(img image.Image, k int) []color.RGBA {
1328
rgbaimg := imageToRGBA(img)

color_test.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,18 +106,16 @@ func TestDistance_SameColor(t *testing.T) {
106106
}
107107

108108
func TestDistance_BlackAndWhite(t *testing.T) {
109-
black := color.RGBA{0, 0, 0, 255}
110-
white := color.RGBA{255, 255, 255, 255}
111109
// sqrt(255^2 * 3) = 255 * sqrt(3)
112110
want := 255 * math.Sqrt(3)
113-
got := distance(black, white)
111+
got := distance(Black, White)
114112
if math.Abs(got-want) > 1e-9 {
115113
t.Errorf("distance(black, white) = %v, want %v", got, want)
116114
}
117115
}
118116

119117
func TestDistance_SingleChannel(t *testing.T) {
120-
a := color.RGBA{0, 0, 0, 255}
118+
a := Black
121119
b := color.RGBA{3, 4, 0, 255}
122120
// sqrt(9 + 16) = 5
123121
want := 5.0
@@ -263,13 +261,11 @@ func TestTakecolor_SolidColorKGreaterThan1(t *testing.T) {
263261
func TestTakecolor_TwoDistinctColors(t *testing.T) {
264262
// k-means 的初始中心随机选取,可能两次都落到同一颜色区域导致不收敛。
265263
// 多次运行,验证算法至少能在 30 次尝试中有一次正确分离两种颜色。
266-
red := color.RGBA{255, 0, 0, 255}
267-
blue := color.RGBA{0, 0, 255, 255}
268-
img := twoColorImage(20, 20, red, blue)
264+
img := twoColorImage(20, 20, Red, Blue)
269265
const maxAttempts = 30
270266
for attempt := 0; attempt < maxAttempts; attempt++ {
271267
result := takecolor(img, 2)
272-
if len(result) == 2 && colorInSlice(red, result, 5) && colorInSlice(blue, result, 5) {
268+
if len(result) == 2 && colorInSlice(Red, result, 5) && colorInSlice(Blue, result, 5) {
273269
return // 成功分离,测试通过
274270
}
275271
}

context.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ func (dc *Context) SetColor(c color.Color) {
415415
// 符号(#)是可选的。支持3位数和6位数的变体。8位数字
416416
// 也可以提供设置 alpha 值。
417417
func (dc *Context) SetHexColor(x string) {
418-
dc.SetRGBA255(parseHexColor(x))
418+
dc.SetRGBA255(ParseHexColor(x))
419419
}
420420

421421
// SetRGBA255 sets the current color. r, g, b, a values should be between 0 and

context_test.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package gg
22

33
import (
4-
"image/color"
54
"math/rand"
65
"testing"
76
)
@@ -288,9 +287,9 @@ func TestDrawPoint(t *testing.T) {
288287
func TestLinearGradient(t *testing.T) {
289288
dc := NewContext(100, 100)
290289
g := NewLinearGradient(0, 0, 100, 100)
291-
g.AddColorStop(0, color.RGBA{0, 255, 0, 255})
292-
g.AddColorStop(1, color.RGBA{0, 0, 255, 255})
293-
g.AddColorStop(0.5, color.RGBA{255, 0, 0, 255})
290+
g.AddColorStop(0, Green)
291+
g.AddColorStop(1, Blue)
292+
g.AddColorStop(0.5, Red)
294293
dc.SetFillStyle(g)
295294
dc.DrawRectangle(0, 0, 100, 100)
296295
dc.Fill()
@@ -301,9 +300,9 @@ func TestLinearGradient(t *testing.T) {
301300
func TestRadialGradient(t *testing.T) {
302301
dc := NewContext(100, 100)
303302
g := NewRadialGradient(30, 50, 0, 70, 50, 50)
304-
g.AddColorStop(0, color.RGBA{0, 255, 0, 255})
305-
g.AddColorStop(1, color.RGBA{0, 0, 255, 255})
306-
g.AddColorStop(0.5, color.RGBA{255, 0, 0, 255})
303+
g.AddColorStop(0, Green)
304+
g.AddColorStop(1, Blue)
305+
g.AddColorStop(0.5, Red)
307306
dc.SetFillStyle(g)
308307
dc.DrawRectangle(0, 0, 100, 100)
309308
dc.Fill()

examples/gradient-conic_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@ func TestGC(t *testing.T) {
1313
grad1 := gg.NewConicGradient(200, 200, 0)
1414
grad1.AddColorStop(0.0, color.Black)
1515
grad1.AddColorStop(0.5, color.RGBA{255, 215, 0, 255})
16-
grad1.AddColorStop(1.0, color.RGBA{255, 0, 0, 255})
16+
grad1.AddColorStop(1.0, gg.Red)
1717

1818
grad2 := gg.NewConicGradient(200, 200, 90)
19-
grad2.AddColorStop(0.00, color.RGBA{255, 0, 0, 255})
20-
grad2.AddColorStop(0.16, color.RGBA{255, 255, 0, 255})
21-
grad2.AddColorStop(0.33, color.RGBA{0, 255, 0, 255})
22-
grad2.AddColorStop(0.50, color.RGBA{0, 255, 255, 255})
23-
grad2.AddColorStop(0.66, color.RGBA{0, 0, 255, 255})
24-
grad2.AddColorStop(0.83, color.RGBA{255, 0, 255, 255})
25-
grad2.AddColorStop(1.00, color.RGBA{255, 0, 0, 255})
19+
grad2.AddColorStop(0.00, gg.Red)
20+
grad2.AddColorStop(0.16, gg.Yellow)
21+
grad2.AddColorStop(0.33, gg.Green)
22+
grad2.AddColorStop(0.50, gg.Cyan)
23+
grad2.AddColorStop(0.66, gg.Blue)
24+
grad2.AddColorStop(0.83, gg.Magenta)
25+
grad2.AddColorStop(1.00, gg.Red)
2626

2727
dc.SetStrokeStyle(grad1)
2828
dc.SetLineWidth(20)

examples/gradient-linear_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ func TestGL(t *testing.T) {
1111
dc := gg.NewContext(500, 400)
1212

1313
grad := gg.NewLinearGradient(20, 320, 400, 20)
14-
grad.AddColorStop(0, color.RGBA{0, 255, 0, 255})
15-
grad.AddColorStop(1, color.RGBA{0, 0, 255, 255})
16-
grad.AddColorStop(0.5, color.RGBA{255, 0, 0, 255})
14+
grad.AddColorStop(0, gg.Green)
15+
grad.AddColorStop(1, gg.Blue)
16+
grad.AddColorStop(0.5, gg.Red)
1717

1818
dc.SetColor(color.White)
1919
dc.DrawRectangle(20, 20, 400-20, 300)

examples/gradient-radial_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ func TestGR(t *testing.T) {
1111
dc := gg.NewContext(400, 200)
1212

1313
grad := gg.NewRadialGradient(100, 100, 10, 100, 120, 80)
14-
grad.AddColorStop(0, color.RGBA{0, 255, 0, 255})
15-
grad.AddColorStop(1, color.RGBA{0, 0, 255, 255})
14+
grad.AddColorStop(0, gg.Green)
15+
grad.AddColorStop(1, gg.Blue)
1616

1717
dc.SetFillStyle(grad)
1818
dc.DrawRectangle(0, 0, 200, 200)

examples/gradient-text_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package main
22

33
import (
4-
"image/color"
54
"testing"
65

76
"github.com/FloatTech/gg"
@@ -29,8 +28,8 @@ func TestGT(t *testing.T) {
2928

3029
// set a gradient
3130
g := gg.NewLinearGradient(0, 0, W, H)
32-
g.AddColorStop(0, color.RGBA{255, 0, 0, 255})
33-
g.AddColorStop(1, color.RGBA{0, 0, 255, 255})
31+
g.AddColorStop(0, gg.Red)
32+
g.AddColorStop(1, gg.Blue)
3433
dc.SetFillStyle(g)
3534

3635
// using the mask, fill the context with the gradient

factory/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# factory
2+
3+
Originally from [FloatTech/imgfactory](https://github.com/FloatTech/imgfactory), operating raw image.NRGBA object.

factory/effects.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package factory
2+
3+
import (
4+
"image/color"
5+
6+
"github.com/disintegration/imaging"
7+
)
8+
9+
// float64转uint8
10+
func floatUint8(a float64) uint8 {
11+
b := int64(a + 0.5)
12+
if b > 255 {
13+
return 255
14+
}
15+
if b > 0 {
16+
return uint8(b)
17+
}
18+
return 0
19+
}
20+
21+
// AdjustBrightness 亮度(-100, 100)
22+
func (dst *Factory) AdjustBrightness(s float64) *Factory {
23+
return &Factory{
24+
im: imaging.AdjustBrightness(dst.im, s),
25+
}
26+
}
27+
28+
// AdjustContrast 对比度(-100, 100)
29+
func (dst *Factory) AdjustContrast(a float64) *Factory {
30+
return &Factory{
31+
im: imaging.AdjustContrast(dst.im, a),
32+
}
33+
}
34+
35+
// AdjustSaturation 饱和度(-100, 100)
36+
func (dst *Factory) AdjustSaturation(a float64) *Factory {
37+
return &Factory{
38+
im: imaging.AdjustSaturation(dst.im, a),
39+
}
40+
}
41+
42+
// Sharpen 锐化
43+
func (dst *Factory) Sharpen(a float64) *Factory {
44+
return &Factory{
45+
im: imaging.Sharpen(dst.im, a),
46+
}
47+
}
48+
49+
// Blur 模糊图像 正数
50+
func (dst *Factory) Blur(a float64) *Factory {
51+
return &Factory{
52+
im: imaging.Blur(dst.im, a),
53+
}
54+
}
55+
56+
// Grayscale 灰度
57+
func (dst *Factory) Grayscale() *Factory {
58+
b := dst.im.Bounds()
59+
for y1 := b.Min.Y; y1 <= b.Max.Y; y1++ {
60+
for x1 := b.Min.X; x1 <= b.Max.X; x1++ {
61+
a := dst.im.At(x1, y1)
62+
c := color.NRGBAModel.Convert(a).(color.NRGBA)
63+
f := 0.299*float64(c.R) + 0.587*float64(c.G) + 0.114*float64(c.B)
64+
c.R = floatUint8(f)
65+
c.G = floatUint8(f)
66+
c.B = floatUint8(f)
67+
dst.im.Set(x1, y1, c)
68+
}
69+
}
70+
return dst
71+
}
72+
73+
// Invert 反色
74+
func (dst *Factory) Invert() *Factory {
75+
b := dst.im.Bounds()
76+
for y1 := b.Min.Y; y1 <= b.Max.Y; y1++ {
77+
for x1 := b.Min.X; x1 <= b.Max.X; x1++ {
78+
a := dst.im.At(x1, y1)
79+
c := color.NRGBAModel.Convert(a).(color.NRGBA)
80+
c.R = 255 - c.R
81+
c.G = 255 - c.G
82+
c.B = 255 - c.B
83+
dst.im.Set(x1, y1, c)
84+
}
85+
}
86+
return dst
87+
}
88+
89+
// Relief 浮雕
90+
func (dst *Factory) Relief() *Factory {
91+
return &Factory{
92+
im: imaging.Convolve3x3(
93+
dst.im,
94+
[9]float64{
95+
-1, -1, 0,
96+
-1, 1, 1,
97+
0, 1, 1,
98+
},
99+
nil,
100+
),
101+
}
102+
}

0 commit comments

Comments
 (0)