Ci ho costruito attorno un paio di funzioni che potrebbero andare a sostituire le famigerate e lentissime funzioni getpixel di gm.
In base ai test che ho effettuato il mio getpixel risulta circa 7.5 volte più efficiente di quello interno nell'eleborazione di intere immagini. Questo risultato é stato ottenuto testando con immagini da 160x120, 320x240, 640x480, con un getpixel per ogni pixel dell'immagine.
Anche se non ho potuto testare, visti i tempi sotto il millisecondo, una chiamata ad un singlo getpixel. La singola chiamata tuttavia penso sia piu lenta nel mio script rispetto a quello interno, in quanto il mio script alla prima chiamata deve salvare su disco il file e aprirlo in binario.
Ecco gli script (leggete bene le descrizioni per sapere come usarli):
gp_init_scr
Codice: Seleziona tutto
//Descrizione: inizializza il getpixel per un background,uno sprite o una surface. Va chiamato PRIMA di usare gp_get_scr, e una sola volta per ogni risorsa
//Argomenti: tipo,risorsa,(image_index)
//tipo: rappresenta il tipo di risorsa dai cui si vuole ricavare i pixel, 0 = surface, 1 = background, 2 = sprite
//risorsa: la surface, il background o la sprite dal quale si vuole ricavare il pixel
//image_index: nel caso di uno sprite, si puo indicare la sub immagine (lasciare vuoto per surface e background)
var file,bg;
file = temp_directory+"/gp.bmp";
if(file_exists(file)) {file_delete(file);}
switch(argument0) {
case 0: surface_save(argument1,file);
global.gp_w = surface_get_width(argument1);
global.gp_h = surface_get_height(argument1);
break;
case 1: background_save(argument1,file);
global.gp_w = background_get_width(argument1);
global.gp_h = background_get_height(argument1);
break;
case 2: sprite_save(argument1,argument2,file);
global.gp_w = sprite_get_width(argument1);
global.gp_h = sprite_get_height(argument1);
break;
}
global.gp_hd = 54;
global.gp_file = file_bin_open(file,0);
Codice: Seleziona tutto
//Descrizione: script da chiamare quando si ha terminato di richiedere pixel ad una risorsa
file_bin_close(global.gp_file);
Codice: Seleziona tutto
//Descrizione: ritorna il colore del pixel in posizione x,y della risorsa attualmente aperta utilizzando gp_init_scr().
//Argomenti: x,y
var x_posn,y_posn;
x_posn=argument0
y_posn=global.gp_h-argument1-1
if(x_posn < global.gp_w && y_posn < global.gp_h && x_posn >= 0 && y_posn >= 0){
var r,g,b,p;
p=x_posn+(y_posn*global.gp_w);
file_bin_seek(global.gp_file,global.gp_hd+(p*4));
b=file_bin_read_byte(global.gp_file);
g=file_bin_read_byte(global.gp_file);
r=file_bin_read_byte(global.gp_file);
return make_color_rgb(r,g,b);
}
else {return 0;}