エクセル上で動画再現の解説など | .·.·ε多智花ღ楓з·.·.のブログ

.·.·ε多智花ღ楓з·.·.のブログ

セカンドライフ&MonsterHunterFrontierのことや自身の製作物など不定期更新で書いていきます

以前投稿した「エクセルで侵略!イカ娘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の値を基にセルに配色していけば変換完了となります。



この記事は随時追記しながら更新していこうと思います。