/* * Hanashizume Image ripper * 1999/12/26 by TF * usage: hanacg hanacg.dll */ #include #include #define TABLE_POS 0x7680 #define OFFSET (0xe9a0 - 0xf5a0) #define IMAGE_NUM 910 int get4b(FILE *); int read_table(FILE *in, int *, int *); int main(int argc, char *argv[]) { FILE *in, *out; int i; unsigned char *buf; char fname[16]; int position[IMAGE_NUM], size[IMAGE_NUM]; in = fopen(argv[1], "r"); if (in == NULL) { fprintf(stderr, "No such a file %s.\n", argv[1]); exit(1); } /* read table */ fseek(in, TABLE_POS, SEEK_SET); for (i = 0; i < IMAGE_NUM; i++) { position[i] = get4b(in); size[i] = get4b(in); /* skip null bytes */ get4b(in); get4b(in); } /* error in DLL? */ position[898] += 0x80; /* read and output JPG data */ for (i = 0; i < IMAGE_NUM; i++) { if (i == 901) { /* OMAKE PNG image */ sprintf(fname, "hana%03d.png", i); } else { sprintf(fname, "hana%03d.jpg", i); } fprintf(stderr, "output %s...", fname); out = fopen(fname, "w"); fseek(in, position[i] + OFFSET, SEEK_SET); buf = (unsigned char *)calloc(size[i], sizeof(unsigned char)); fread(buf, 1, size[i], in); fwrite(buf, 1, size[i], out); fprintf(stderr, "done.\n"); free(buf); fclose(out); } fclose(in); return 0; } int get4b(FILE *in) { unsigned char b1, b2, b3, b4; b1 = fgetc(in); b2 = fgetc(in); b3 = fgetc(in); b4 = fgetc(in); return (b4 << 24) | (b3 << 16) | (b2 << 8) | b1; }