以前投稿した「エクセルで侵略!イカ娘OPを再現してみたでゲソ!」に解説希望のコメを書いて下さった方がいらっしゃったので、この記事で使用したツールやコードの解説、変換時の留意点などを書いてみようと思います。
VBAの基本的な記述方法などを理解しているのを前提としますので、解らない場合は入門書などで勉強してから作成することをお勧めします。
一部簡単なAPIも使用します。
まずは使用ツール
Microsoft Ofice EXCEL2007
AviUtl 動画から連番BMP生成
Irfan View32 日本語版 連番BMPを自由な色数に減色
次に変換ミスを少しだけ軽減する作業
作成する動画が1種類だけで、他に作らないのであれば省いてもOK
変数名などは適当に書きますので、解りやすいように変更して下さい。
Dim fileName As String
Dim totalFile As Long
fileName = Dir( thisWorkbook.path & "\BMP\bmp_*.bmp")
Do While fileName <> ""
totalFile = totalFile + 1
fileName = Dir()
Loop
ここまででBMPフォルダ内に入っているBMP(ファイル名=BMP_0000.bmp)の数を取得します。
totalFile変数-1の数値が総フレーム数(0~totalFile-1)になります。
このコードをFunctionでモジュールとしても良いのですが、totalFileは何度も使用するのでグローバルで宣言するか戻り値として返す必要があります。
続いてファイルの情報を取得します。
解像度の取得のためなので、手動で入れられる場合は省けます。
Dim fp As Long
Dim FileSize As Long
Dim readFile() As Byte
Dim bmpFormat_pos(15) As Integer
Dim GetHedder(15) As Long
Dim a,b As Integer
Dim a2,a3 As Long
For i = 0 to 15
Select Case i
Case 0,2 To 3,8 To 9
b = 2
Case Else
b = 4
End Select
bmpFormat_pos(i) = b
Next i
fp = FreeFile
Open thisWorkbook.path & "\BMP\bmp_0000.bmp" For Binary As #fp
FileSize = LOF(fp)
Get #fp, , readFile
Close #fp
a = 0
For i = 0 To 15
a2 = 0
For i2 = 0 To bmpFormat_pos(i) - 1 'readFileをLong型に書き換え
a3 = readFile(a)
if i2 = 0 then
a2 = a3
ElseIf i2 = 1 then
a2 = a2 + ( a3 * 256)
ElseIf i2 = 2 then
a2 = a2 + ( a3 * 65536)
ElseIf i2 = 3 then
a2 = a2 + ( a3 * 16777216)
End If
a = a + 1
Next i2
GetHedder(i) = a2
Next i
これのGetHedder(6)が幅、GetHedder(7)が高さになります。
この2つも何度も使うことになるので、解りやすい変数に代入しておくと楽です。
画像からピクセルデータを取得します
Dim PixData()
Dim now_fram As String
Dim hFile As Long
Dim FileSizeB As Long
ReDim PixData(GetHedder(6),GetHedder(7), 2, totalFile-1) 'それぞれ取得してない場合は手入力
For i = 0 To totalFile - 1 'ファイル数取得してない場合はフレーム数入力
now_fram = Format(i, "0000")
fileName = thisWorkbook.path & "\BMP\bmp_" & now_fram & ".bmp"
If fileName <> "False" Then
hFile = FreeFile
Open fileName For Binary As #hFile
FileSizeB = LOF(hFile)
ReDim readFile(FileSizeB)
Get #hFile, , readFile
Close #hFile
For i2 = 0 To GetHedder(7) - 1
For i3 = 0 To GetHedder(6) - 1
For c = 0 To 2
PixData(i3,i2,c,i) = readFile(((GetHedder(6) * 3 *i2)+(i3 * 3) + (GetHedder(4) + c))
Next c
Next i3
Next i2
End if
Next i
これでPixData(x座標,y座標,RGB値)にピクセルデータが入ります。
基礎部分は以上となります。
あとはPixDataの値を基にセルに配色していけば変換完了となります。
この記事は随時追記しながら更新していこうと思います。