マジョカアイリスの中のmicroSDカードの画像データ(640×48ピクセルのRGB565形式の生データ)を切り出すためのプログラムを書いてみた。
同様のプログラムをC#作っている人は既に居るみたいなのだが、自分はC#は苦手なのでCで書いた。
ソースコード(majoka-splite.c)は、以下のとおり。
// Majoka-Iris microSD data(AB565.bin) splitter
// by E.Kako (www.kako.com)
#include <stdio.h>
#include <string.h>
unsigned char buf[14155776];
int main(void)
{
FILE *fp;
FILE *fp2;
char fname[256];
int n,i;
printf("<<< Majoka-Iris microSD data(AB565.bin) splitter >>>\n");
// read file
fp=fopen("AB565.bin","rb");
if (fp==NULL) { printf("AB565.bin file not found.\n"); return 1; }
n=fread(buf,1,14155776,fp);
fclose(fp);
printf("read %d bytes.\n",n);
if (n!=14155776) { printf("file read error.\n"); return 1; }
// cut 80 files from the top of AB565.bin
// 640x16 pixel rgb565 format , size: 61440 bytes
printf("creating files...\n");
for (i=0;i<80;i++) {
sprintf(fname,"a%d.bin",i);
fp2=fopen(fname,"wb");
fwrite(buf+61440*i,1,61440,fp2);
fclose(fp2);
}
printf("finished.\n");
return 0;
}
Visual Studio 2019でビルドをするためのbatファイルもここに置いておく。
echo "--------- Enviromnent Setting ----------"
rem set environment for Visual Studio 2019
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86
echo "--------- Compile ----------"
cl majoka-split.c
del *.obj
pause
batファイルとcのソースコードを同じフォルダーに入れて、batファイルを実行すると、majoka-split.exeという実行ファイルが得られる。
マジョカアイリスのmicroSDカードからSDカードリーダーなどを使って中のファイルを取り出して、そのうちのAB565.binファイルをmajoka-split.exeという実行ファイルと同じフォルダーに置いて、majoka-split.exeを実行する。
問題が無ければ、a0.bin~a79.binというファイルが生成される。
生成されたファイルはRGB565形式の生データファイルだ。
ffmpegを使うとbmpファイルに変換することが可能だ。
そのためのbatファイルもここに置いておく。batで実行しなくてもcmd.exeにコマンドをコピーして実行してもよいだろう。
a0.bin~a2.binの3つだけをa0.bmp~a2.bmpに変換するものだ。それ以外も変換する場合はちょっと弄ってやれば変更は容易だと思う。
ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 640x48 -i a0.bin -vcodec bmp a0.bmp
ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 640x48 -i a1.bin -vcodec bmp a1.bmp
ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 640x48 -i a2.bin -vcodec bmp a2.bmp
(追記 – GIMPに読み込みさせることも可能だ。
拡張子を.dataに変更して読ませると、「Rawデータから画像読み込み」というダイアログが出てくるので、RGB565 Little Endianで、幅640、高さ48、と設定することで正しく読み出せる。
GIMPで読み出したあとは、bmp形式など好きな形式で書き出せばよい。)
bmpファイルになったあとは、画像編集ソフトとかを使って書き換えたり、別の同じサイズ(640×48)のbmpファイルを新規で作って差し替えたりすることができるだろう。
—
差し替えのbmpファイルをRGB565形式に戻すには、自分は以下のツールを使った。
ChaNさんのサイトhttp://elm-chan.org/にて公開されているソフトで、BMP→バイナリ変換ツールというものだ。
変換ができたら、あとは、元のAB565.binの中身の該当部分を差し替えの個別のbinファイルの中身に書き換える必要がある。
AB565.bin書き換え用のプログラムも、作成した。
ソースコードをちょっと整理したあとで、以下に追記して置いておこうと思う。
—
追記
書き換え用のプログラムのソースコードは以下のとおりだ。
これ(majoka-change.c)も上記と同様にVisual Studio 2019などでコンパイルして実行すればよい。
実行時には、exeファイルと同じフォルダーに変更元のAB565.binと、新しく作ったa0.bin~a79.binを置いておくこと。
データを置き換えたあとの変更後のデータはAB565-new.binというファイルに出力される。
// Majoka-Iris microSD data(AB565.bin) changer
// by E.Kako (www.kako.com)
#include <stdio.h>
#include <string.h>
unsigned char buf[14155776];
unsigned char buf2[61440];
int main(void)
{
FILE *fp;
FILE *fp2;
FILE *fp3;
char fname[256];
int n,i,j;
printf("<<< Majoka-Iris microSD data(AB565.bin) changer >>>\n");
// read original file
fp=fopen("AB565.bin","rb");
if (fp==NULL) { printf("file not found.\n"); return 0; }
n=fread(buf,1,14155776,fp);
fclose(fp);
printf("read %d bytes.\n",n);
if (n!=14155776) { printf("file read error.\n"); return 0; }
// read files
printf("read files and change data...\n");
for (i=0;i<80;i++) {
sprintf(fname,"a%d.bin",i);
printf("processing.. %s\n",fname);
fp2=fopen(fname,"rb");
if (fp2==NULL) { printf("file not found.\n"); return 0; }
n=fread(buf2,1,61440,fp2);
fclose(fp2);
printf("read %d bytes.\n",n);
if (n!=61440) { printf("file read error.\n"); return 0; }
for (j=0;j<61440;j++) {
buf[i*61440+j]=buf2[j];
}
}
printf("write result to AB565-new.bin\n");
// write to new file
fp3=fopen("AB565-new.bin","wb");
fwrite(buf,1,14155776,fp3);
fclose(fp3);
printf("finished.\n");
return 0;
}