本来是做着好玩的,虽然好像有点脑洞,但是这个挺有意思的记录一下
题目如下
#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')
然后智障的一幕出现了。。。
没错。。。我忘了它的宽高很小的问题了。。
然后我试了一下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')
跑一下,出来长下面这样
好像有点样子了呢,是字母的样子
翻转看下,有html呢,应该就是这样弄没错,但这其他的我怎么看不懂啊。。然后继续懵逼
没辙,去看了下评论,然后知道了这是X BitMap,解法跟我想的一样,但是有一个问题,就是bit存放大小端的问题,于是我去改了一下代码,将二进制的数字倒转一下
于是得到下面的
好了结果出来了,过程还是很有意思的
最后的代码贴一下
# -*- 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