[ harrynull.tech ] Stage-19 X BitMap

本来是做着好玩的,虽然好像有点脑洞,但是这个挺有意思的记录一下
题目如下

#define test_width 40
#define test_height 7
static char test_bits[] = {
  0x00, 0x80, 0x00, 0x00, 0x00, 0x15, 0x80, 0xA0, 0x44, 0x80, 0x2B, 0xA9,
  0x66, 0xE4, 0x80, 0xB9, 0xAA, 0x28, 0x4C, 0x96, 0x09, 0xB3, 0x2C, 0x54,
  0xAA, 0x31, 0x82, 0x2A, 0x95, 0xAA, 0x80, 0x01, 0x0C, 0x00, 0x00, }; 

好了,没了,刚看完我是懵逼的。。。
好吧,再瞅瞅?
有宽和高,那么八成是个图片了,但是怎么把它变成图片,看了一下bits有35个,好像有点巧,正好是高的倍数,那么排成7行的话,每行5个,唉,又很巧的,5*8不就是40的吗,是8呢,那么十有八九要转成2进制,于是我们得到如下

0000000000000001000000000000000000000000
1010100000000001000001010010001000000001
1101010010010101011001100010011100000001
1001110101010101000101000011001001101001
1001000011001101001101000010101001010101
1000110001000001010101001010100101010101
0000000110000000001100000000000000000000

好了继续迷茫。。。
记得以前见过二进制字符串转成二维码的,那么试试?
好的,动手吧
然后得到了下面的脚本

from PIL import Image
s = [0x00, 0x80, 0x00, 0x00, 0x00, 0x15, 0x80, 0xA0, 0x44, 0x80, 0x2B, 0xA9, 0x66, 0xE4, 0x80, 0xB9, 0xAA, 0x28, 0x4C, 0x96, 0x09, 0xB3, 0x2C, 0x54, 0xAA, 0x31, 0x82, 0x2A, 0x95, 0xAA, 0x80, 0x01, 0x0C, 0x00, 0x00]

width = 40
height = 7

img = Image.new("RGB", (width, height))

flag = ''
for c in s:
    flag += bin(c)[2:].rjust(8,'0')

n = 0
for i in range(height):
    for j in range(width):
        if flag[n] == '0':
            img.putpixel([j, i], (255, 255, 255))
        else:
            img.putpixel([j, i], (0, 0, 0))
        n += 1

img.show()
# img.save('test.bmp')

然后智障的一幕出现了。。。

image.png

没错。。。我忘了它的宽高很小的问题了。。
然后我试了一下resize(),然后他给我报错了,好吧,我错了,我自己写还不行吗
然后有了下面这个

from PIL import Image
s = [0x00, 0x80, 0x00, 0x00, 0x00, 0x15, 0x80, 0xA0, 0x44, 0x80, 0x2B, 0xA9, 0x66, 0xE4, 0x80, 0xB9, 0xAA, 0x28, 0x4C, 0x96, 0x09, 0xB3, 0x2C, 0x54, 0xAA, 0x31, 0x82, 0x2A, 0x95, 0xAA, 0x80, 0x01, 0x0C, 0x00, 0x00]

width = 40
height = 7
t = 20

img = Image.new("RGB", (width*t, height*t))

flag = ''
for c in s:
    flag += bin(c)[2:].rjust(8,'0')

print len(flag)

for i in range(height*t):
    for j in range(width*t):
        x = j / t 
        y = i / t
        n = y*40 + x
        if flag[n] == '0':
            img.putpixel([j, i], (255, 255, 255))
        else:
            img.putpixel([j, i], (0, 0, 0))

img.show()
# img.save('test.bmp')

跑一下,出来长下面这样

image.png

好像有点样子了呢,是字母的样子
翻转看下,有html呢,应该就是这样弄没错,但这其他的我怎么看不懂啊。。然后继续懵逼
没辙,去看了下评论,然后知道了这是X BitMap,解法跟我想的一样,但是有一个问题,就是bit存放大小端的问题,于是我去改了一下代码,将二进制的数字倒转一下
于是得到下面的

image.png

好了结果出来了,过程还是很有意思的
最后的代码贴一下

# -*- coding: utf8 -*-
# by: gakki429
from PIL import Image
s = [0x00, 0x80, 0x00, 0x00, 0x00, 0x15, 0x80, 0xA0, 0x44, 0x80, 0x2B, 0xA9, 0x66, 0xE4, 0x80, 0xB9, 0xAA, 0x28, 0x4C, 0x96, 0x09, 0xB3, 0x2C, 0x54, 0xAA, 0x31, 0x82, 0x2A, 0x95, 0xAA, 0x80, 0x01, 0x0C, 0x00, 0x00]

width = 40
height = 7
t = 20 # 放大倍数

img = Image.new("RGB", (width*t, height*t))

flag = ''
for c in s:
    flag += bin(c)[2:].rjust(8,'0')[::-1] # 转换为二进制数字,并填充至8位然后倒转

print len(flag)

for i in range(height*t):
    for j in range(width*t):
        x = j / t 
        y = i / t
        n = y*40 + x
        # print 'i:%d, j:%d, x:%d, y:%d, n:%d' % (i, j, x, y, n)
        if flag[n] == '0':
            img.putpixel([j, i], (255, 255, 255))
        else:
            img.putpixel([j, i], (0, 0, 0))

img.show()
# img.save('test.bmp')
关于X BitMap 
https://en.wikipedia.org/wiki/X_BitMap

推荐阅读更多精彩内容