@@ -25,6 +25,7 @@ import (
25
25
"math"
26
26
27
27
"github.com/soniakeys/quant"
28
+ "github.com/soniakeys/quant/internal"
28
29
)
29
30
30
31
// Quantizer methods implement mean cut color quantization.
@@ -85,6 +86,8 @@ func (Quantizer) Quantize(p color.Palette, m image.Image) color.Palette {
85
86
type quantizer struct {
86
87
img image.Image // original image
87
88
cs []cluster // len(cs) is the desired number of colors
89
+
90
+ pxRGBA func (x , y int ) (r , g , b , a uint32 ) // function to get original image RGBA color values
88
91
}
89
92
90
93
type point struct { x , y int32 }
@@ -107,7 +110,7 @@ const (
107
110
108
111
func newQuantizer (img image.Image , n int ) * quantizer {
109
112
if n < 1 {
110
- return & quantizer {img , nil }
113
+ return & quantizer {img : img , pxRGBA : internal . PxRGBAfunc ( img ) }
111
114
}
112
115
// Make list of all pixels in image.
113
116
b := img .Bounds ()
@@ -123,7 +126,7 @@ func newQuantizer(img image.Image, n int) *quantizer {
123
126
// Make clusters, populate first cluster with complete pixel list.
124
127
cs := make ([]cluster , n )
125
128
cs [0 ].px = px
126
- return & quantizer {img , cs }
129
+ return & quantizer {img : img , cs : cs , pxRGBA : internal . PxRGBAfunc ( img ) }
127
130
}
128
131
129
132
// Cluster by repeatedly splitting clusters in two stages. For the first
@@ -187,7 +190,7 @@ func (q *quantizer) setPriority(c *cluster, early bool) {
187
190
minG := uint32 (math .MaxUint32 )
188
191
minB := uint32 (math .MaxUint32 )
189
192
for _ , p := range c .px {
190
- r , g , b , _ := q .img . At (int (p .x ), int (p .y )). RGBA ( )
193
+ r , g , b , _ := q .pxRGBA (int (p .x ), int (p .y ))
191
194
if r < minR {
192
195
minR = r
193
196
}
@@ -237,17 +240,17 @@ func (q *quantizer) cutValue(c *cluster, early bool) uint32 {
237
240
switch c .widestDim {
238
241
case rgbR :
239
242
for _ , p := range c .px {
240
- r , _ , _ , _ := q .img . At (int (p .x ), int (p .y )). RGBA ( )
243
+ r , _ , _ , _ := q .pxRGBA (int (p .x ), int (p .y ))
241
244
sum += uint64 (r )
242
245
}
243
246
case rgbG :
244
247
for _ , p := range c .px {
245
- _ , g , _ , _ := q .img . At (int (p .x ), int (p .y )). RGBA ( )
248
+ _ , g , _ , _ := q .pxRGBA (int (p .x ), int (p .y ))
246
249
sum += uint64 (g )
247
250
}
248
251
case rgbB :
249
252
for _ , p := range c .px {
250
- _ , _ , b , _ := q .img . At (int (p .x ), int (p .y )). RGBA ( )
253
+ _ , _ , b , _ := q .pxRGBA (int (p .x ), int (p .y ))
251
254
sum += uint64 (b )
252
255
}
253
256
}
@@ -270,7 +273,7 @@ func (q *quantizer) split(s, c *cluster, m uint32) {
270
273
last := len (px ) - 1
271
274
for i <= last {
272
275
// Get color value in appropriate dimension.
273
- r , g , b , _ := q .img . At (int (px [i ].x ), int (px [i ].y )). RGBA ( )
276
+ r , g , b , _ := q .pxRGBA (int (px [i ].x ), int (px [i ].y ))
274
277
switch s .widestDim {
275
278
case rgbR :
276
279
v = r
@@ -300,7 +303,7 @@ func (qz *quantizer) paletted() *image.Paletted {
300
303
// Average values in cluster to get palette color.
301
304
var rsum , gsum , bsum int64
302
305
for _ , p := range px {
303
- r , g , b , _ := qz .img . At (int (p .x ), int (p .y )). RGBA ( )
306
+ r , g , b , _ := qz .pxRGBA (int (p .x ), int (p .y ))
304
307
rsum += int64 (r )
305
308
gsum += int64 (g )
306
309
bsum += int64 (b )
@@ -327,7 +330,7 @@ func (qz *quantizer) palette() quant.Palette {
327
330
// Average values in cluster to get palette color.
328
331
var rsum , gsum , bsum int64
329
332
for _ , p := range px {
330
- r , g , b , _ := qz .img . At (int (p .x ), int (p .y )). RGBA ( )
333
+ r , g , b , _ := qz .pxRGBA (int (p .x ), int (p .y ))
331
334
rsum += int64 (r )
332
335
gsum += int64 (g )
333
336
bsum += int64 (b )
0 commit comments