#include #include #include "zlib.h" //※zlibをリンクすること #define ZIPBUFSIZE (32 * 1024) BOOL ReadAPDHeader(); void ReadIMGHeader(); void ReadLayer(); BOOL ZIPDecode(LPBYTE,DWORD,LPBYTE,DWORD); void WriteBMP(char *,LPBYTE,DWORD); FILE *fp; WORD imgWidth,imgHeight,LayerCnt,LayerNumCnt,CurLayer; //--------------- //メイン void main(int argc,char *argv[]) { DWORD size; if(argc != 2) return; // fp = fopen(argv[1], "rb"); if(!fp) return; //APDヘッダ if(!ReadAPDHeader()) { printf("APDファイルでないか、バージョンエラー"); fclose(fp); return; } //イメージ全体の情報 ReadIMGHeader(); printf("幅 %d 高さ %d レイヤ数 %d\n", imgWidth, imgHeight, LayerCnt); //プレビューイメージ //(ここでは飛ばす) fseek(fp, 4, SEEK_CUR); fread(&size, 4, 1, fp); fseek(fp, size, SEEK_CUR); //レイヤ読み込み ReadLayer(); fclose(fp); } //-------------------- //APDヘッダ読み込み BOOL ReadAPDHeader() { char m[8]; BYTE ver; //ヘッダ文字 fread(m, 7, 1, fp); m[7] = 0; if(lstrcmp(m, "AZPDATA") != 0) return FALSE; //バージョン fread(&ver, 1, 1, fp); if(ver != 0) return FALSE; return TRUE; } //---------------------------- //イメージ全体の情報読み込み void ReadIMGHeader() { DWORD size; //ヘッダデータサイズ fread(&size, 4, 1, fp); //幅・高さ fread(&imgWidth, 2, 1, fp); fread(&imgHeight, 2, 1, fp); //レイヤ数 fread(&LayerCnt, 2, 1, fp); //レイヤ通算カウント fread(&LayerNumCnt, 2, 1, fp); //カレントレイヤ fread(&CurLayer, 2, 1, fp); //余分なデータがあれば飛ばす fseek(fp, size - 10, SEEK_CUR); } //--------------------- //レイヤ読み込み void ReadLayer() { int i; char name[32],m[30]; BYTE mode,alpha,flag; DWORD size,dsize,hsize; LPBYTE pZIPBuf,pImgBuf; //展開後のイメージサイズ dsize = imgWidth * imgHeight * 4; //メモリ確保 pZIPBuf = (LPBYTE)malloc(ZIPBUFSIZE); if(!pZIPBuf) return; pImgBuf = (LPBYTE)malloc(dsize); if(!pImgBuf){ free(pZIPBuf); return; } //レイヤヘッダサイズ fread(&hsize, 4, 1, fp); //各レイヤ読み込み for(i = 0; i < LayerCnt; i++) { //レイヤ名 fread(name, 32, 1, fp); //合成モード fread(&mode, 1, 1, fp); //不透明度 fread(&alpha, 1, 1, fp); //フラグ fread(&flag, 1, 1, fp); //flag & 1 : 表示状態(0 or 1) //(flag >> 1) & 3 : 透明色保護(0 - 2) //(flag >> 3) & 1 : アルファマスク(0 or 1) //ヘッダ余分な部分を飛ばす fseek(fp, hsize - 35, SEEK_CUR); //圧縮後のデータサイズ fread(&size, 4, 1, fp); //展開 if(!ZIPDecode(pImgBuf, dsize, pZIPBuf, size)) { printf("展開エラー"); break; } //BMP出力 wsprintf(m, "layer%d.bmp", i); WriteBMP(m, pImgBuf, dsize); printf("%s -> %s\n", name, m); } free(pImgBuf); free(pZIPBuf); } //-------------------- //ZIP展開 BOOL ZIPDecode(LPBYTE pDstBuf,DWORD dwDstSize,LPBYTE pInBuf,DWORD dwSrcSize) { z_stream z; DWORD remain = dwSrcSize; int ret; //zlib初期化 ZeroMemory(&z, sizeof(z_stream)); if(inflateInit(&z) != Z_OK) return FALSE; z.next_out = pDstBuf; z.avail_out = dwDstSize; //読み込み while(1) { //ファイルから読み込み if(z.avail_in == 0) { z.next_in = pInBuf; z.avail_in = fread(pInBuf, 1, (remain < ZIPBUFSIZE)? remain: ZIPBUFSIZE, fp); remain -= z.avail_in; } ret = inflate(&z, Z_NO_FLUSH); if(ret == Z_STREAM_END) break; else if(ret != Z_OK) { inflateEnd(&z); return FALSE; } } inflateEnd(&z); return TRUE; } //----------------- //BMP出力 void WriteBMP(char *name,LPBYTE pBuf,DWORD bufsize) { BITMAPFILEHEADER fh; BITMAPINFOHEADER ih; FILE *fpOut; ZeroMemory(&fh, sizeof(fh)); fh.bfType = 0x4d42; fh.bfSize = sizeof(fh) + sizeof(ih) + bufsize; fh.bfOffBits = sizeof(fh) + sizeof(ih); ZeroMemory(&ih, sizeof(ih)); ih.biSize = sizeof(ih); ih.biWidth = imgWidth; ih.biHeight = imgHeight; ih.biPlanes = 1; ih.biBitCount = 32; // fpOut = fopen(name, "wb"); if(!fpOut) return; fwrite(&fh, sizeof(fh), 1, fpOut); fwrite(&ih, sizeof(ih), 1, fpOut); fwrite(pBuf, bufsize, 1, fpOut); fclose(fpOut); }