とりあえず ここ のサンプルをそのまま動かすpythonコード
if __name__ == '__main__':
bmp = ''.join(map(chr,[
0x42,0x4d, # 'BM'
0x48,0,0,0, # file size 0x48
0,0, # 0
0,0, # 0
0x20,0,0,0, # pixel data start at 0x20
0x0c,0,0,0, # size of struct, 0x0c
0x0a,0, # image height: 10
0x0a,0, # image width: 10
1,0, # 1
1,0, # 1
0x00,0x00,0x80, # color: dark red (#800000)
0x00,0x00,0x00, # color: black
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, # * pixel data
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, # *
0,0,0,0,0,0,0,0 # *
]))
f = open('test.bmp', 'wb') # 'wb' (write + binary)
f.write(bmp)
f.close()
出力: 

HSL空間から、RGB空間への座標変換など
def hsl2rgb(h, s, l):
h %= 360
assert any(isinstance(x, float) for x in (h, s, l))
assert 0 <= h < 360
assert 0 <= s <= 1
assert 0 <= l <= 1
if l <= 0.5:
sat_diff = s*l
else:
sat_diff = s*(1-l)
max = l + sat_diff
min = l - sat_diff
hue_diff = 2*sat_diff*(h%60)/60
if h < 60:
r = max
g = min + hue_diff
b = min
elif 60 <= h < 120:
r = max - hue_diff
g = max
b = min
elif 120 <= h < 180:
r = min
g = max
b = min + hue_diff
elif 180 <= h < 240:
r = min
g = max - hue_diff
b = max
elif 240 <= h < 300:
r = min + hue_diff
g = min
b = max
elif 300 <= h :
r = max
g = min
b = max - hue_diff
return r, g, b
def unit2byte(x):
return chr(int(x*255))
画像の出力など
import math
import random
import imlib
class Pixel(object):
def __init__(self, rgb=None, hsl=None):
if rgb:
self.rgb = rgb
elif hsl:
self.rgb = imlib.hsl2rgb(*hsl)
else:
self.rgb = 0, 0, 0
def __str__(self):
return ''.join(map(imlib.unit2byte, self.rgb))
class PPM(object):
def __init__(self, xy):
self.x, self.y = xy
self.table = [[Pixel(hsl=[(1-abs(self.grad(i)*self.grad(j)*2-1))*36000/1.67, 1.0 , 0.5]) for i in range(self.x)] for j in range(self.y)]
def grad(self, c, r=0):
if not r:
return float(c)/self.x
else:
return float(self.x - c)/self.x
def grad_y(self, c):
return c*255/self.y
def to_ppm(self):
data = 'P6\n#\n%s %s\n255\n' % (self.x, self.y)
data += ''.join(''.join(str(pixel) for pixel in row) for row in self.table)
return data
def save_as(self, file):
f = open(file, 'wb')
f.write(self.to_ppm())
f.close()
def test():
PPM((120,)*2).save_as('img.ppm')
if __name__ == '__main__':
test()
45x45:






48x48:

























.
.
.
.
.









































120x120:
















































添付ファイル
- a1.png
- a10.png
- a11.png
- a12.png
- a2.png
- a3.png
- a4.png
- a5.png
- a6.png
- a7.png
- a8.png
- a9.png
- b.png
- b2.png
- b3.png
- b4.png
- gray1.png
- gray2.png
- gray3.png
- gray4.png
- gray5.png
- img.png
- img10.png
- img11.png
- img12.png
- img13.png
- img14.png
- img15.png
- img16.png
- img17.png
- img19.png
- img2.png
- img20.png
- img21.png
- img22.png
- img23.png
- img24.png
- img3.png
- img4.png
- img5.png
- img6.png
- img7.png
- img8.png
- img9.png
- my.png
- t.png
- t10.png
- t11.png
- t12.png
- t13.png
- t14.png
- t2.png
- t3.png
- t4.png
- t5.png
- t6.png
- t7.png
- t8.png
- t9.png
- test.bmp
- white.png