slime@2
|
1 |
#!/usr/bin/perl -w
|
slime@2
|
2 |
|
slime@2
|
3 |
use strict;
|
slime@2
|
4 |
|
slime@2
|
5 |
my $input_file = $ARGV[0] || "text.bmp";
|
slime@2
|
6 |
|
slime@2
|
7 |
###################################################
|
slime@2
|
8 |
|
slime@2
|
9 |
my $buffer = '';
|
slime@2
|
10 |
|
slime@2
|
11 |
open(F, $input_file) or die $!;
|
slime@2
|
12 |
binmode(F);
|
slime@2
|
13 |
while(my $temp = <F>){$buffer .= $temp;}
|
slime@2
|
14 |
close(F);
|
slime@2
|
15 |
|
slime@2
|
16 |
# read header
|
slime@2
|
17 |
# 0 2 UINT bfType;
|
slime@2
|
18 |
# 2 4 DWORD bfSize;
|
slime@2
|
19 |
# 6 2 UINT bfReserved1;
|
slime@2
|
20 |
# 8 2 UINT bfReserved2;
|
slime@2
|
21 |
# 10 4 DWORD bfOffBits;
|
slime@2
|
22 |
|
slime@2
|
23 |
my $header = substr($buffer, 0, 14);
|
slime@2
|
24 |
$buffer = substr($buffer, 14);
|
slime@2
|
25 |
|
slime@2
|
26 |
# read info
|
slime@2
|
27 |
# 0 4 DWORD biSize;
|
slime@2
|
28 |
# 4 4 LONG biWidth;
|
slime@2
|
29 |
# 8 4 LONG biHeight;
|
slime@2
|
30 |
# 12 2 WORD biPlanes;
|
slime@2
|
31 |
# 14 2 WORD biBitCount;
|
slime@2
|
32 |
# 16 4 DWORD biCompression;
|
slime@2
|
33 |
# 20 4 DWORD biSizeImage;
|
slime@2
|
34 |
# 24 4 LONG biXPelsPerMeter;
|
slime@2
|
35 |
# 28 4 LONG biYPelsPerMeter;
|
slime@2
|
36 |
# 32 4 DWORD biClrUsed;
|
slime@2
|
37 |
# 36 4 DWORD biClrImportant;
|
slime@2
|
38 |
|
slime@2
|
39 |
my $info = substr($buffer, 0, 40);
|
slime@2
|
40 |
my $bits = substr($buffer, 40);
|
slime@2
|
41 |
|
slime@2
|
42 |
my ($bitcount) = unpack('v', substr($info, 14, 2));
|
slime@2
|
43 |
my ($compress) = unpack('i', substr($info, 16, 4));
|
slime@2
|
44 |
my ($size_x) = unpack('i', substr($info, 4, 4));
|
slime@2
|
45 |
my ($size_y) = unpack('i', substr($info, 8, 4));
|
slime@2
|
46 |
|
slime@2
|
47 |
unless ($bitcount == 24){
|
slime@2
|
48 |
die "can only operate on 24 bit bitmaps (this is $bitcount bit)";
|
slime@2
|
49 |
}
|
slime@2
|
50 |
unless ($compress == 0){
|
slime@2
|
51 |
die "can only operate on uncompressed bitmaps";
|
slime@2
|
52 |
}
|
slime@2
|
53 |
|
slime@2
|
54 |
####################################################
|
slime@2
|
55 |
|
slime@2
|
56 |
|
slime@2
|
57 |
my $line_shift = $size_x * 3;
|
slime@2
|
58 |
$line_shift += ($size_x % 4);
|
slime@2
|
59 |
|
slime@2
|
60 |
|
slime@2
|
61 |
print "/*Bitmap-Size: $size_x x $size_y */\n";
|
slime@2
|
62 |
print "/* | 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || : || (undef) | */\n";
|
slime@2
|
63 |
|
slime@2
|
64 |
my $x;
|
slime@2
|
65 |
my $y;
|
slime@2
|
66 |
|
slime@2
|
67 |
for ($y=$size_y-1; $y >= 0; $y--) {
|
slime@2
|
68 |
printf ("/* Row %2d */ \"",($size_y - $y - 1));
|
slime@2
|
69 |
for ($x=0; $x <=$size_x-1; $x=$x+8){
|
slime@2
|
70 |
my $_8pix = 0;
|
slime@2
|
71 |
for my $subx(0..7) {
|
slime@2
|
72 |
my $offset = (($x+$subx) * 3) + ($y * $line_shift);
|
slime@2
|
73 |
my $b = ord(substr($bits, $offset+0, 1));
|
slime@2
|
74 |
my $g = ord(substr($bits, $offset+1, 1));
|
slime@2
|
75 |
my $r = ord(substr($bits, $offset+2, 1));
|
slime@2
|
76 |
unless (($r == 255) && ($g == 255) && ($b == 255)){
|
slime@2
|
77 |
$_8pix += 2 ** (7 - $subx);
|
slime@2
|
78 |
}
|
slime@2
|
79 |
|
slime@2
|
80 |
}
|
slime@2
|
81 |
print "\\x";
|
slime@2
|
82 |
print "0" if ($_8pix < 16);
|
slime@2
|
83 |
printf ("%x",$_8pix);
|
slime@2
|
84 |
}
|
slime@2
|
85 |
print "\"\n";
|
slime@2
|
86 |
}
|