-
-
Save alaingalvan/2a37bc4619b2e67415638522f03ac42f to your computer and use it in GitHub Desktop.
///read_bmp(filename) | |
// Reads 24 or 32 bit bitmap files | |
//returns a ds_grid of colors encoded as rgb hex | |
var handle; | |
handle = file_bin_open(argument0, 0); | |
var offset, width, height, bits, output; | |
offset = 29; | |
width = 0; | |
height = 0; | |
bits = 0; | |
var i; | |
for (i = 0; i < offset; i += 1) { | |
if (i == 10) | |
offset = file_bin_read_byte(handle); | |
else | |
if (i == 11) | |
offset += file_bin_read_byte(handle) << 8; | |
else | |
if (i == 12) | |
offset += file_bin_read_byte(handle) << 16; | |
else | |
if (i == 13) | |
offset += file_bin_read_byte(handle) << 24; | |
else | |
if (i == 18) | |
width = file_bin_read_byte(handle); | |
else | |
if (i == 19) | |
width += file_bin_read_byte(handle) << 8; | |
else | |
if (i == 20) | |
width += file_bin_read_byte(handle) << 16; | |
else | |
if (i == 21) | |
width += file_bin_read_byte(handle) << 24; | |
else | |
if (i == 22) | |
height = file_bin_read_byte(handle); | |
else | |
if (i == 19) | |
height += file_bin_read_byte(handle) << 8; | |
else | |
if (i == 20) | |
height += file_bin_read_byte(handle) << 16; | |
else | |
if (i == 21) | |
height += file_bin_read_byte(handle) << 24; | |
else | |
if (i == 28) | |
bits = file_bin_read_byte(handle); | |
else | |
file_bin_read_byte(handle); // Skip | |
} | |
var output; | |
output = ds_grid_create(width, height); | |
var j; | |
for (j = 0; j < height; j += 1) { | |
for (i = 0; i < width; i += 1) { | |
var r, g, b, value; | |
r = file_bin_read_byte(handle); | |
g = file_bin_read_byte(handle) << 8; | |
b = file_bin_read_byte(handle) << 16; | |
if (bits == 32) | |
file_bin_read_byte(handle); | |
value = r + g + b; | |
ds_grid_set(output, i, (height-1)-j, value); | |
} | |
if (bits == 24) { | |
// Padding | |
for (h = 0; h < (width * 3) mod 4; h += 1) { | |
file_bin_read_byte(handle); | |
} | |
} | |
} | |
file_bin_close(handle); | |
return output; |
Thanks @MarcusAugustusCaesar, I've corrected this now!
Hello,
Was reading through this and noticed there was some duplicate if statements in there (19, 20, 21). Not that this will functionally change anything but I made a more condensed version of that section if you'd like to use it. Anyways, thank you for sharing this, it was super helpful!
for (i = 0; i < offset; i += 1) {
switch (i) {
case 10: offset = file_bin_read_byte(handle); break;
case 11: offset += file_bin_read_byte(handle) << 8; break;
case 12: offset += file_bin_read_byte(handle) << 16; break;
case 13: offset += file_bin_read_byte(handle) << 24; break;
case 18: width = file_bin_read_byte(handle); break;
case 19: width += file_bin_read_byte(handle) << 8; break;
case 20: width += file_bin_read_byte(handle) << 16; break;
case 21: width += file_bin_read_byte(handle) << 24; break;
case 22: height = file_bin_read_byte(handle); break;
case 28: bits = file_bin_read_byte(handle); break;
default: file_bin_read_byte(handle); break; // Skip
}
}
(not sure why it's not adding in the spaces/tabs :/)
Hi! Thx for making this, haven't tested it out yet. But line 61
for (i = 0 i < width; i += 1) {
There has to be a ; after the 0.
Regards