• Hey Guest! Ever feel like entering a Game Jam, but the time limit is always too much pressure? We get it... You lead a hectic life and dedicating 3 whole days to make a game just doesn't work for you! So, why not enter the GMC SLOW JAM? Take your time! Kick back and make your game over 4 months! Interested? Then just click here!

GameMaker get closest color in array of colors or black?

S

Shadowblitz16

Guest
hello I am looping through the array of colors and trying to check what color is the closest, and if it is return the index of the color for storing.

however my code doesn't seem to work. it alway returns black or (0,0,0) can someone tell me why?
Code:
/// @desc color_closest_pal()
/// @param color
/// @param palette

var col = argument[0];
var pal = argument[1];

var len = array_length_1d(pal);
var ind = 0;

var r = 0;
var g = 0; 
var b = 0;

for(var i=0; i<len; i++)
{ 
    r = min(color_get_red(col)   - color_get_red(pal[i]),   r); 
    g = min(color_get_green(col) - color_get_green(pal[i]), g); 
    b = min(color_get_blue(col)  - color_get_blue(pal[i]),  b);
   
    if (pal[i] == make_color_rgb(r, g, b)) return i;
}

return 0;
 

GMWolf

aka fel666
Im not sure what your logic is, so i cannot correct you.
you cannot treat each channel separately. and you need a way to find the difference every time.
Try this instead:
Code:
/// @desc color_closest_pal()
/// @param color
/// @param palette

var col = argument[0];
var pal = argument[1];

var len = array_length_1d(pal);
var ind = 0;

nearest = pal[0];
nearest_delta = sqrt ( sqr(abs(color_get_red(col) - color_get_red(pal[0]))) + sqr(abs(color_get_green(col) - color_get_green(pal[0]))) + sqr(abs(color_blue_red(col) - color_get_blue(pal[0]))) );

for(var i=1; i<len; i++)
{
   var d = sqrt ( sqr(abs(color_get_red(col) - color_get_red(pal[i]))) + sqr(abs(color_get_green(col) - color_get_green(pal[i]))) + sqr(abs(color_blue_red(col) - color_get_blue(pal[i]))) );
  if (d < nearest_delta) {
    nearest_delta = d;
    nearest = pal[i];
  }
}

return nearest;

EDIT:
let me try to explain some things that are wrong with your code:
you are treating each channel seperately. so you will get the nearest r, nearest g, nearest b. not nearest rgb.
you return a value inside the loop. how can you return inside the loop if you dont know if what come later is nearest.
r = min(color_get_red(col) - color_get_red(pal), r); what even is that? run that in your head and see if it makes sense. do you understand what min does?
 

TheouAegis

Member
I would separate the channels, but the value of all 3 would be compared. In other words...

closest_factor = $300;
closest_color = 0;
for(i=0; i<len; i++)
{
factor[3] = col - pal[ i ];
factor[1] = factor[0] >> 8;
factor[2] = factor[0] >> 16;
factor[0] = factor[3] + factor[1] + factor[2] & $2FF;
if factor[0] < closest_factor {
closest_factor = factor[0];
closest_color = pal[ i ]; }
}
return closest_color;
 
S

Shadowblitz16

Guest
@Fel666 just a question about this because I come back here often
why doesn't this code not work?
Code:
/// @desc graphics_get_closest_color();
/// @arg palette
/// @arg color

var _palette = argument[0];
var _color   = argument[1];

var _len     = array_length_1d(_palette);
var _ind     = 0;

var _nearest_color = _palette[0];
var _nearest_delta =
sqrt
(
    sqr(abs(color_get_red(_color)   - color_get_red(_palette[0]))) +
    sqr(abs(color_get_green(_color) - color_get_green(_palette[0]))) +
    sqr(abs(color_get_blue(_color)  - color_get_blue(_palette[0])))
);

for(var _i=1; _i<_len; _i++)
{
    var _new_delta =
    sqrt
    (
        sqr(abs(color_get_red(_color)   - color_get_red(_palette[_i]))) +
        sqr(abs(color_get_green(_color) - color_get_green(_palette[_i]))) +
        sqr(abs(color_get_blue(_color)  - color_get_blue(_palette[_i])))
    );
    if (_new_delta <= _nearest_delta)
    {
        _nearest_delta = _new_delta;
        _nearest_color = _palette[_i];
    }
}

return _nearest_color;
 

GMWolf

aka fel666
why doesn't this code not work?
Well as far as I can tell is shouldn't not work. I mean. It looks all good to me.
How are you calling it? And what are you getting back?

Quick note: no need to call abs() before squaring. The square a of a negative is positive.
 
S

Shadowblitz16

Guest
@Fel666 I am passing it an array of rgb hex colors
and then a single hex color

I am calling it like this

Code:
/// @desc graphics_import_tile()
/// @arg  quest_controller
/// @arg  surface
/// @arg  palette
/// @arg  index

//Parameters
var _quest = argument[0];
var _surf  = argument[1];
var _pal   = argument[2];
var _ind   = argument[3];

//Return if quest does not exist
if (!instance_exists(_quest)) return array_create(GRAPHICS_TILE_SIZE*GRAPHICS_TILE_SIZE, 0);

///Single tile surf and it's size
var _tile    = surface_create(GRAPHICS_TILE_SIZE, GRAPHICS_TILE_SIZE);
var _tile_x  = _ind mod surface_get_width(_surf);
var _tile_y  = _ind div surface_get_width(_surf);

//Draw to tile surf
surface_set_target(_tile);
draw_surface_part(_surf, _tile_x * GRAPHICS_TILE_SIZE, _tile_y * GRAPHICS_TILE_SIZE, GRAPHICS_TILE_SIZE, GRAPHICS_TILE_SIZE, 0, 0);
surface_reset_target();

//Convert tile surf to indexed array
var _data = array_create(GRAPHICS_TILE_SIZE*GRAPHICS_TILE_SIZE, 0);
for (var _y=0; _y<GRAPHICS_TILE_SIZE; _y++)
for (var _x=0; _x<GRAPHICS_TILE_SIZE; _x++)
{
    var _color   = surface_getpixel(_tile, _x, _y);
    var _closest = graphics_get_closest_color(_pal, _color);
    _data[_x+_y*GRAPHICS_TILE_SIZE] = _closest;
}
return _data;
EDIT: wait no I am getting 4278190080 back

just a sec
 

GMWolf

aka fel666
Hmmm. I would print some test values to make sure. Before it is called, print out the pallet and colour.
Inside the loop, try printing out the distances, and check them by hand.
(There is probably a small error we are both missing somewhere).
 
S

Shadowblitz16

Guest
so the color it is returning is 4278190080 or FF000000 or A:255, R:0,, G;0, B:0
so its not working


Code:
Color: 0
Loop: 1
New Delta: 104.93
Cur Delta: 0
Color: 0
Loop: 2
New Delta: 269.63
Cur Delta: 0
Color: 0
Loop: 3
New Delta: 336.19
Cur Delta: 0
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 10150907
Loop: 1
New Delta: 442.25
Cur Delta: 371.81
Color: 10150907
Loop: 2
New Delta: 608.86
Cur Delta: 371.81
Color: 10150907
Loop: 3
New Delta: 696.94
Cur Delta: 371.81
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 0
Loop: 1
New Delta: 104.93
Cur Delta: 0
Color: 0
Loop: 2
New Delta: 269.63
Cur Delta: 0
Color: 0
Loop: 3
New Delta: 336.19
Cur Delta: 0
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 10150907
Loop: 1
New Delta: 442.25
Cur Delta: 371.81
Color: 10150907
Loop: 2
New Delta: 608.86
Cur Delta: 371.81
Color: 10150907
Loop: 3
New Delta: 696.94
Cur Delta: 371.81
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 10150907
Loop: 1
New Delta: 442.25
Cur Delta: 371.81
Color: 10150907
Loop: 2
New Delta: 608.86
Cur Delta: 371.81
Color: 10150907
Loop: 3
New Delta: 696.94
Cur Delta: 371.81
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 10150907
Loop: 1
New Delta: 442.25
Cur Delta: 371.81
Color: 10150907
Loop: 2
New Delta: 608.86
Cur Delta: 371.81
Color: 10150907
Loop: 3
New Delta: 696.94
Cur Delta: 371.81
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 10150907
Loop: 1
New Delta: 442.25
Cur Delta: 371.81
Color: 10150907
Loop: 2
New Delta: 608.86
Cur Delta: 371.81
Color: 10150907
Loop: 3
New Delta: 696.94
Cur Delta: 371.81
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 10150907
Loop: 1
New Delta: 442.25
Cur Delta: 371.81
Color: 10150907
Loop: 2
New Delta: 608.86
Cur Delta: 371.81
Color: 10150907
Loop: 3
New Delta: 696.94
Cur Delta: 371.81
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 0
Loop: 1
New Delta: 104.93
Cur Delta: 0
Color: 0
Loop: 2
New Delta: 269.63
Cur Delta: 0
Color: 0
Loop: 3
New Delta: 336.19
Cur Delta: 0
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2126283
Loop: 1
New Delta: 284.31
Cur Delta: 234.53
Color: 2126283
Loop: 2
New Delta: 442.25
Cur Delta: 234.53
Color: 2126283
Loop: 3
New Delta: 535.86
Cur Delta: 234.53
Color: 2109553
Loop: 1
New Delta: 193.36
Cur Delta: 126.87
Color: 2109553
Loop: 2
New Delta: 358.72
Cur Delta: 126.87
Color: 2109553
Loop: 3
New Delta: 442.25
Cur Delta: 126.87
Color: 0
Loop: 1
New Delta: 104.93
Cur Delta: 0
Color: 0
Loop: 2
New Delta: 269.63
Cur Delta: 0
Color: 0
Loop: 3
New Delta: 336.19
Cur Delta: 0
 
Last edited by a moderator:
how are you testing that you get back zero?

are you sure _pal has the correct value(s)?

some other things... no reason to abs() something you're going to sqr(). Also, probably don't need sqrt() at all. You should get rgb of _color only once instead of every time through the loop. What is the purpose of setting _nearest_color to an initial value at _pal[0]?

edit:

one more thing. are you sure the initial color on the surface is actually correct? You're not trying to do this outside of a draw event, are you?
 
S

Shadowblitz16

Guest
idk

yes pal is an array of colors
I am checking if the current palette color is nearer to the color then the last palette color
I am setting the initial value to palette[0] because that is black/full transparency

this is done in the create event and the draw event

also this isn't normal sprites I am using it's a indexed color array

EDIT: I plan on using a shader to get and draw this stuff later but right now its going to be really slow

EDIT2: renamed some stuff but didn't fix it (of course)
Code:
/// @desc graphics_get_closest_color();
/// @arg palette
/// @arg color

var _palette = argument[0];
var _color   = argument[1];

var _cur_color = _palette[0];
var _cur_delta = 
sqrt 
(
    sqr(abs(color_get_red(_color)   - color_get_red(_palette[0]))) + 
    sqr(abs(color_get_green(_color) - color_get_green(_palette[0]))) + 
    sqr(abs(color_get_blue(_color)  - color_get_blue(_palette[0])))
);

var _len     = array_length_1d(_palette);
var _ind     = 0;
for(var _i=1; _i<_len; _i++)
{
    var _new_delta = 
    sqrt 
    (
        sqr(abs(color_get_red(_color)   - color_get_red(_palette[_i]))) + 
        sqr(abs(color_get_green(_color) - color_get_green(_palette[_i]))) + 
        sqr(abs(color_get_blue(_color)  - color_get_blue(_palette[_i])))
    );
    if (_cur_delta > _new_delta) 
    {
        _cur_delta =  _new_delta;
        _cur_color =  _palette[_i];
    }
    show_debug_message("Color: "    +string(_color));
    show_debug_message("Loop: "     +string(_i));
    show_debug_message("New Delta: "+string(_new_delta));
    show_debug_message("Cur Delta: "+string(_cur_delta));
}

return _cur_color;
 
Last edited by a moderator:
I've been doing my own tests with a script almost identical to yours, and I am getting no errors. I think your problem is not inside graphics_get_closest_color(). I think maybe the arguments you are supplying to it are wrong.

what does surface_getpixel return? Is it bgr, or does it include the alpha component. If it includes alpha, that could be throwing everything off. If I were you, I wouldn't be reading from a surface at all, I would send it to a buffer, and read from the buffer.
 
Top