sprite_trim
Script for GM:Studio.
Remove the pixels with alpha 0 from the borders
Returns a new sprite or -1 for error.
Source code
///sprite_trim(sprite, subimg)
if(!sprite_exists(argument0))
return -1;
var w = sprite_get_width(argument0);
var h = sprite_get_height(argument0);
var xo = sprite_get_xoffset(argument0);
var yo = sprite_get_yoffset(argument0);
var s = surface_create(w, h);
surface_set_target(s);
draw_clear_alpha(0, 0);
draw_sprite(argument0, argument1, xo, yo);
surface_reset_target();
var buf = buffer_create(w * h * 4, buffer_fixed, 4);
buffer_get_surface(buf, s, 0, 0, 0);
var xx, yy, pixel, a;
var left = 0, top = 0, right = 0, bottom = 0;
//left
for(xx = 0; xx < w; xx++)
{
for(yy = 0; yy < h; yy++)
{
pixel = buffer_peek(buf, (xx + yy * w) * 4, buffer_u32);
a = (pixel >> 24) & 255;
if(a != 0)
break;
}
if(a != 0)
break;
else
left++;
}
//top
for(yy = 0; yy < h; yy++)
{
for(xx = 0; xx < w; xx++)
{
pixel = buffer_peek(buf, (xx + yy * w) * 4, buffer_u32);
a = (pixel >> 24) & 255;
if(a != 0)
break;
}
if(a != 0)
break;
else
top++;
}
//right
for(xx = w-1; xx >= 0; xx--)
{
for(yy = 0; yy < h; yy++)
{
pixel = buffer_peek(buf, (xx + yy * w) * 4, buffer_u32);
a = (pixel >> 24) & 255;
if(a != 0)
break;
}
if(a != 0)
break;
else
right++;
}
//bottom
for(yy = h-1; yy >= 0; yy--)
{
for(xx = 0; xx < w; xx++)
{
pixel = buffer_peek(buf, (xx + yy * w) * 4, buffer_u32);
a = (pixel >> 24) & 255;
if(a != 0)
break;
}
if(a != 0)
break;
else
bottom++;
}
buffer_delete(buf);
surface_free(s)
return sprite_create_from_surface(s, left, top, w-left-right, h-top-bottom, 0, 0, xo-left, yo-top);