正規表現が間違っているようです。そのため、私はそれを行うために小さな C プログラムを作成しました。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 1048576
char stuff[MAX_SIZE];
int main (int argc, char **argv)
{
unsigned int j_off, j_len, p_off, p_len;
FILE *fp, *jp, *pp;
fp = fopen (argv[1], "r");
if (!fp) goto error;
if (fseek (fp, 12, SEEK_SET)) goto error;
if (!fread (&j_off, 4, 1, fp)) goto error;
if (!fread (&j_len, 4, 1, fp)) goto error;
if (!fread (&p_off, 4, 1, fp)) goto error;
if (!fread (&p_len, 4, 1, fp)) goto error;
fprintf (stderr, "INFO %s \t%d %d %d %d\n",
argv[1], j_off, j_len, p_off, p_len);
if (j_len > MAX_SIZE || p_len > MAX_SIZE) {
fprintf (stderr, "%s: Chunk size too big!\n", argv[1]);
return EXIT_FAILURE;
}
jp = fopen (argv[2], "w");
if (!jp) goto error;
if (fseek (fp, j_off, SEEK_SET)) goto error;
if (!fread (stuff, j_len, 1, fp)) goto error;
if (!fwrite (stuff, j_len, 1, jp)) goto error;
fclose (jp);
pp = fopen (argv[3], "w");
if (!pp) goto error;
if (fseek (fp, p_off, SEEK_SET)) goto error;
if (!fread (stuff, p_len, 1, fp)) goto error;
if (!fwrite (stuff, p_len, 1, pp)) goto error;
fclose (pp);
fclose (fp);
return EXIT_SUCCESS;
error:
perror (argv[1]);
return EXIT_FAILURE;
}
これは、コマンド ライン パラメーター input.hpi output.jpg output.png で動作します。エラー処理は 100% 正しいわけではありませんが、何かが間違っているかどうか、そしてほとんどの場合、それが何であるかを常に教えてくれるだけで十分です。大きなファイルの場合、MAX_SIZE を拡大する必要があります。
以下は、*.hpi で呼び出すことができるシェル スクリプトです。
#!/bin/bash
dest=<destination-folder>
for arg in "$@"
do
base=`echo $arg | cut -d'.' -f1`
<executable> $arg $dest/original/$base.jpg $dest/mask/$base.png 2>>$dest/log
#composite -compose CopyOpacity $dest/mask/$base.png $dest/original/$base.jpg $dest/rgba/$base.png
done
オプションの合成コマンド (ImageMagick に付属) は、アルファ チャネルとして適用されたマスクを持つ新しい PNG 画像を作成します。このファイルは、元のファイルの約 5 倍の大きさになることに注意してください。
一部の HPI ファイルはマスクなしで提供されることに注意してください。この場合、私のプログラムは引き続き動作しますが、空の PNG ファイルが生成されます。