BMP - (2008/09/09 (火) 01:33:01) の最新版との変更点
追加された行は緑色になります。
削除された行は赤色になります。
とりあえず[[ ここ >http://wisdom.sakura.ne.jp/system/winapi/win32/win114.html]]のサンプルをそのまま動かす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()
出力: &ref(test.bmp)
test45: &ref(my.png) &ref(img.png) &ref(img2.png)
test48: &ref(img3.png) &ref(img4.png) &ref(img5.png) &ref(img6.png) &ref(img7.png) &ref(img8.png) &ref(img9.png) &ref(img10.png)
&ref(img11.png)
とりあえず[[ ここ >http://wisdom.sakura.ne.jp/system/winapi/win32/win114.html]]のサンプルをそのまま動かす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()
出力: &ref(test.bmp)
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:
&ref(my.png) &ref(img.png) &ref(img2.png)
48x48:
&ref(img3.png) &ref(img4.png) &ref(img5.png) &ref(img6.png) &ref(img7.png) &ref(img8.png) &ref(img9.png) &ref(img10.png)
&ref(img11.png) &ref(img12.png) &ref(img13.png) &ref(img14.png) &ref(img15.png) &ref(img16.png) &ref(img17.png)
&ref(img21.png) &ref(img20.png)
&ref(white.png) &ref(img19.png) &ref(img23.png)
&ref(white.png) &ref(white.png) &ref(img22.png) &ref(img24.png)
&ref(gray1.png).&ref(gray2.png).&ref(gray3.png).&ref(gray4.png).&ref(gray5.png).
&ref(a1.png) &ref(a2.png) &ref(a3.png) &ref(a4.png) &ref(a5.png) &ref(a6.png)
120x120:
&ref(a7.png) &ref(a8.png) &ref(a9.png) &ref(a10.png) &ref(a11.png) &ref(a12.png)
&ref(t.png) &ref(t2.png) &ref(t3.png) &ref(t4.png) &ref(t5.png) &ref(t6.png) &ref(t7.png)
&ref(t8.png) &ref(t9.png) &ref(t10.png) &ref(t11.png) &ref(t12.png) &ref(t13.png) &ref(t14.png)
&ref(b.png) &ref(b2.png) &ref(b3.png) &ref(b4.png)
表示オプション
横に並べて表示:
変化行の前後のみ表示: