主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Python: PILで画像合成のスクリプト執筆中

                
tags: python


↑こんなムービーを作るために、PythonImagingLibraryで画像を合成しまくった。合成した画像はC#でプログラミング的につなげてAVIファイルにした(参考)。

import Image
import random
import glob
import os

CURRENT_DIR = os.getcwd()
PIC_WIDTH = 1000
PIC_HEIGHT = 750

def make_micro():
uris = glob.glob(CURRENT_DIR + r"\source\*.JPG")
micro = Image.new("RGB", (16100, 12075))

W = 100
H = 75
x = 0
y = 0
x_max, y_max = micro.size
for y in xrange(0, y_max, H):
for x in xrange(0, x_max, W):
while 1:
uri = random.choice(uris)
image = Image.open(uri)
width , height = image.size
if width > 4000:
continue
elif (float(height) / width) == 0.75:
print uri, width, height, x, y
break
image.thumbnail((W, H), Image.ANTIALIAS)
micro.paste(image, (x, y, x+W, y+H))
micro.save(CURRENT_DIR + r"\micro.jpg")

# fade in
def make_fadein():
##m = (w - 600) / 2.0 / 4.0 + 1
step = range(0, 1000, 10) + range(1000, 1600, 6) +\
range(1600, 1850, 2) + range(1850, 1951, 1)
step.reverse()
print len(step)
order = 1
for num in step:
micro_trimed = micro.crop((int(num*4), int(num*3), int(w-num*4), int(h-num*3)))
micro_resized = micro_trimed.resize((PIC_WIDTH, PIC_HEIGHT))

alpha = (float(order) / len(step)) * 0.8 + 0.2
macro_trimed = macro.crop((int(num*4/ratio), int(num*3/ratio), int((w-num*4)/ratio), int((h-num*3)/ratio)))
macro_resized = macro_trimed.resize((PIC_WIDTH, PIC_HEIGHT))
blend = Image.blend(micro_resized, macro_resized, alpha)

blend.save(CURRENT_DIR + r"\synth\im_f{number:05d}.jpg".format(number=order))
print order
order += 1

# slide in
def make_slidein():
##step = range(1900, 1951, 1)
step = [x * 0.1 for x in range(19000, 19501, 5)]
order = 1
alpha = 0
for num in step:
micro_trimed = micro.crop((int(num*4), int(num*3), int(num*4+500), int(num*3+375)))
micro_resized = micro_trimed.resize((PIC_WIDTH, PIC_HEIGHT))

macro_trimed = macro.crop((int(num*4/ratio), int(num*3/ratio), int((num*4+500)/ratio), int((num*3+375)/ratio)))
macro_resized = macro_trimed.resize((PIC_WIDTH, PIC_HEIGHT))
alpha = (float(order) / len(step)) * 0.2
blend = Image.blend(micro_resized, macro_resized, alpha)

blend.save(CURRENT_DIR + r"\synth\im_e{number:05d}.jpg".format(number=order))
print order
order += 1


make_micro()
macro = Image.open("macro.jpg")
micro = Image.open("micro.jpg")

macro = macro.resize((6000, 4500))

w, h = micro.size
ratio = float(w) / macro.size[0]
make_fadein()
make_slidein()


PILで画像のサイズ変更をしたいい場合、resizeメソッドとthumbnailメソッドがある。resizeでは縦横比をくずすことができ、thumbnailでは縦横比を維持することができる。しかしなぜだろう。resizeはメソッドとしてImageインスタンスを返すが、thumbnailを実行した場合は、実行したインスタンスに保持されているイメージのサイズが変更される。どちらかに統一してほしいところ。
ほかの環境に移せるようにと考えて、IronPythonで動かそうとしたけどPILメソッドのなかにCでコンパイルされたものがあった。PILはIronPythonでは使えない。


im = Image.open("hoge")
new_im = im.resize((400, 300))
im.thumbnail((400, 300))
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。