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

スポンサーサイト

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

IronPython: 画像を合成してムービーを作る

                


ムービーとは静止画を多量にならべたものだ。今回は多量の静止画を用意して、それらからムービーを作ってみた。静止画をAVIファイルとして統合させるところだけC#。多量の静止画はIronPythonからGraphicsクラスを利用して合成、生成した。

C#による、JPEGのAVIへの合成は以下を参照。
http://elicon.blog57.fc2.com/blog-entry-236.html

import sys, System
sys.path.append("Lib")

import clr
import gc
import random

clr.AddReference("System.Drawing")

from System import Array, Console
from System.IO import Directory, DirectoryInfo, FileInfo
from System.Drawing import Graphics, Bitmap, Image, Drawing2D, Point, Rectangle, GraphicsUnit, Imaging

clr.AddReference("AviGenerator")
import AviGenerator

CURRENT_DIR = Directory.GetCurrentDirectory()
PIC_WIDTH = 1000
PIC_HEIGHT = 750

def MakeMicro():
W = 100
H = 75
uris = DirectoryInfo(CURRENT_DIR + r"\source").GetFiles("*.JPG")
micro = Bitmap(16100, 12075)
micro_g = Graphics.FromImage(micro)
thumb = Bitmap(2300, 1725)
thumb_g = Graphics.FromImage(thumb)
x = 0
y = 0
# x_max, y_max = micro.Width, micro.Height

printString = "Processing: 1/4\n{0:.1f}%"
Console.Clear()
Console.WriteLine(printString.format((0.0)))
for y in xrange(0, thumb.Height, H):
for x in xrange(0, thumb.Width, W):
while 1:
uri = random.choice(uris)
image = Image.FromFile(uri.FullName)
width , height = image.Width, image.Height
if width > 4000:
index = uris.index(uri)
uris.pop(uri)
if len(uris) == 0:
raise
continue
elif (float(height) / width) == 0.75:
break
thumb_g.DrawImage(image, x, y, W, H)
gc.collect()
num = float(y) / thumb.Height * 80
System.Console.Clear()
System.Console.WriteLine(printString.format((num)))
thumb_g.Dispose()
System.Console.Clear()
System.Console.WriteLine(printString.format((90.0)))
for y in xrange(0, micro.Height, thumb.Height):
for x in xrange(0, micro.Width, thumb.Width):
micro_g.DrawImage(thumb, x, y, thumb.Width, thumb.Height)
# gc.collect()
# num = float(y) / y_max * 100
# System.Console.Clear()
# System.Console.WriteLine(printString.format((num)))
thumb.Dispose()
micro_g.Dispose()
gc.collect()
micro.Save(CURRENT_DIR + r"\micro.jpg")
return micro

# fade in
def MakeFadein():
blend = Bitmap(PIC_WIDTH, PIC_HEIGHT)
blend_g = Graphics.FromImage(blend)

destRect = Rectangle(0, 0, PIC_WIDTH, PIC_HEIGHT)
imageAttributes = Imaging.ImageAttributes()
# 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
printString = "Processing: 2/4\n{0:.1f}%"
for num in step:
x0, y0, x1, y1 = int(num*4), int(num*3), int(w-num*4), int(h-num*3)
blend_g.DrawImage(micro, destRect, x0, y0, x1-x0, y1-y0, GraphicsUnit.Pixel)

alpha = (float(order) / len(step)) * 0.8 + 0.2
colorMatrix = Imaging.ColorMatrix(((1, 0, 0, 0, 0),
(0, 1, 0, 0, 0),
(0, 0, 1, 0, 0),
(0, 0, 0, alpha, 0),
(0, 0, 0, 0, 1),))
imageAttributes.SetColorMatrix(colorMatrix,
Imaging.ColorMatrixFlag.Default,
Imaging.ColorAdjustType.Bitmap)
x0, y0, x1, y1 = int(num*4/ratio), int(num*3/ratio), int((w-num*4)/ratio), int((h-num*3)/ratio)
blend_g.DrawImage(macro, destRect, x0, y0, x1-x0, y1-y0, GraphicsUnit.Pixel, imageAttributes)

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

num = float(order) / len(step) * 100
System.Console.Clear()
System.Console.WriteLine(printString.format((num)))
order += 1

# slide in
def MakeSlidein():
blend = Bitmap(PIC_WIDTH, PIC_HEIGHT)
blend_g = Graphics.FromImage(blend)

destRect = Rectangle(0, 0, PIC_WIDTH, PIC_HEIGHT)
imageAttributes = Imaging.ImageAttributes()
alpha = 0.2
colorMatrix = Imaging.ColorMatrix(((1, 0, 0, 0, 0),
(0, 1, 0, 0, 0),
(0, 0, 1, 0, 0),
(0, 0, 0, alpha, 0),
(0, 0, 0, 0, 1),))
imageAttributes.SetColorMatrix(colorMatrix,
Imaging.ColorMatrixFlag.Default,
Imaging.ColorAdjustType.Bitmap)
step = [x * 0.1 for x in range(19000, 19501, 5)]
order = 1
printString = "Processing: 3/4\n{0:.1f}%"
for num in step:
x0, y0, x1, y1 = int(num*4), int(num*3), int(500), int(375)
blend_g.DrawImage(micro, destRect, x0, y0, x1, y1, GraphicsUnit.Pixel)

x0, y0, x1, y1 = int(num*4/ratio), int(num*3/ratio), int(500/ratio), int(375/ratio)
blend_g.DrawImage(macro, destRect, x0, y0, x1, y1, GraphicsUnit.Pixel, imageAttributes)

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

num = float(order) / len(step) * 100
System.Console.Clear()
System.Console.WriteLine(printString.format((num)))
order += 1

if FileInfo(r"micro.jpg").Exists:
micro = Bitmap.FromFile("micro.jpg")
else:
micro = MakeMicro()
microG = Graphics.FromImage(micro)
w, h = micro.Width, micro.Height

macro = Bitmap(w/2, h/2)
macroG = Graphics.FromImage(macro)
macroIm = Bitmap.FromFile("macro.jpg")
macroG.DrawImage(macroIm, 0, 0, w/2, h/2)

ratio = float(w) / macro.Width
MakeFadein()
MakeSlidein()
AviGenerator.MyClass.GenerateAvi()



コンパイルしたものも用意した。

使える環境: .NET Framework 4インストール済み環境
テスト済み環境: Win 7(64bit, memory 8GB), Win 8(64bit, memory 2GB)
使い方:
・AviGen.zipをダウンロードして解凍
・sourceディレクトリにサイズ比が横4、縦3の画像を複数枚入れる
・AviGen.exeがあるディレクトリに、macro.jpgという名前の画像を作る
・AviGen.exeを実行
・生成されるsynthesized.aviというファイルをWindowsムービーメーカーなどでエンコード(そのままだと重くて再生が不自由)
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

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

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