-
Notifications
You must be signed in to change notification settings - Fork 27
/
extract_code.rb
54 lines (41 loc) · 1.29 KB
/
extract_code.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
if(ARGV.length != 2)
puts("Usage: extract_code.rb <input.bmp> <output.bin>")
exit(1)
end
# This will contain the new bitmap
result = ""
File.open(ARGV[0], "rb") do |bitmap|
bitmap_file_header = bitmap.read(14)
header, size, reserved1, reserved2, data_offset = bitmap_file_header.unpack("vVvvV")
if(header != 0x4d42)
puts("Not a BMP!")
exit(1)
end
puts("Data offset: 0x%x" % data_offset)
puts("Size: %d" % size)
gdi_size = bitmap.read(4).unpack("V")
if(gdi_size == 12 || gdi_size == 64)
puts("This appears to be an OS/2 bitmap, which we don't support!")
exit(1)
end
bitmapinfoheader = bitmap.read(40)
width, height, planes, bits_per_pixel = bitmapinfoheader.unpack("VVvv")
puts("width: #{width}")
puts("height: #{height}")
puts("planes: #{planes}")
puts("bits_per_pixel: #{bits_per_pixel}")
if(bits_per_pixel != 24)
puts("Sorry, we only accept 24-bit encodings right now!")
exit(1)
end
# Figure out how many bytes we have to work with
byte_count = (size - data_offset)
pixel_count = byte_count / 3 # 24 bits
puts("Image contains #{byte_count} bytes, or #{pixel_count} pixels")
# Get the actual data as an array
bitmap.pos = data_offset
result = bitmap.read(byte_count)
end
File.open(ARGV[1], 'wb') do |out|
out.write(result)
end