容量が増えて中身も増えた / EPSファイルのTIFFプレビューを取り出す

投稿日: 2005年11月07月

容量が増えて中身も増えた

現在のThinkPad X31のHDD空き容量。

  • Cドライブ(39.6GB)
    • 使用領域 24.1GB
    • 空き領域 15.5GB
  • Dドライブ(31.8GB)
    • 使用領域 18.0GB
    • 空き領域 13.8GB
  • 合計(71.4GB)
    • 使用領域 42.1GB
    • 空き領域 29.3

ついこの間、40GBのHDDを80GBにしたばかりで、しかも再セットアップして5日しかたってないのに、もう合計使用領域は40GBを突破。

データドライブであるDドライブが大きくなるのはしょうがないとしても、システム領域のCドライブの空き領域の減り方はどうかと。

Cドライブの中でも特にProgram Filesで10GBっていうのが気になる。最近のアプリケーションの肥大化は酷すぎると思う。

EPSファイルのTIFFプレビューを取り出す

TIFFプレビューが存在するEPSファイルから、TIFFプレビューを取り出す。

#include <stdio.h>
#include <memory.h>
#include <stdlib.h>

void error(const char*);

typedef unsigned char uchar;
typedef unsigned int uint32;

struct EPSBinaryHeader{
    uchar header[4];
    uint32 ps_pos;
    uint32 ps_length;
    uint32 meta_pos;
    uint32 meta_length;
    uint32 tiff_pos;
    uint32 tiff_length;
    uint32 check_sum;
};

int main(int argc, char* argv[])
{
    FILE* fp = NULL;
    size_t read_length = 0;
    struct EPSBinaryHeader header = {0};
    char* ps_buf = NULL;
    void* tiff_buf = NULL;
    FILE* wfp = NULL;
    const static uchar magic_header[4] = {0xc5, 0xd0, 0xd3, 0xc6};
    char tiff_filename[256] = "";

    if(argc < 2){
        error("no input files.");
        goto end;
    }

    fp = fopen(argv[1], "rb");
    if(fp == NULL){
        error("file open error!");
        goto end;
    }

    // read header.
    read_length = fread(header.header,
                        sizeof(header.header[0]),
                        sizeof(header.header),
                        fp);
    if(read_length != sizeof(header.header)){
        error("file size error!\n");
        goto end;
    }

    if(memcmp(header.header, magic_header, sizeof(header.header)) != 0){
        error("file header error!\n");
        goto end;
    }

    // read PostScript.
    fseek(fp, 4, SEEK_SET);
    if(fread(&header.ps_pos, sizeof(header.ps_pos), 1, fp) == 0){
        error("file header error!\n");
        goto end;
    }

    if(fread(&header.ps_length, sizeof(header.ps_length), 1, fp) == 0){
        error("file header error!\n");
        goto end;
    }

    ps_buf = (char*)malloc(header.ps_length);
    if(ps_buf == NULL){
        error("memory alloc error!\n");
        goto end;
    }

    fseek(fp, header.ps_pos, SEEK_SET);
    read_length = fread(ps_buf, sizeof(char), header.ps_length, fp);
    if(read_length != header.ps_length){
        error("read PostScript error!\n");
        goto end;
    }

    // read TIFF.
    fseek(fp, 20, SEEK_SET);
    if(fread(&header.tiff_pos, sizeof(header.tiff_pos), 1, fp) == 0){
        error("read TIFF error!\n");
        goto end;
    }

    if(fread(&header.tiff_length, sizeof(header.tiff_length), 1, fp) == 0){
        error("read TIFF error!\n");
        goto end;
    }

    tiff_buf = malloc(header.tiff_length);
    if(tiff_buf == NULL){
        error("memory alloc error!\n");
        goto end;
    }

    fseek(fp, header.tiff_pos, SEEK_SET);
    read_length = fread(tiff_buf, 1, header.tiff_length, fp);
    if(read_length != header.tiff_length){
        error("read TIFF error!\n");
        goto end;
    }

#ifdef WRITE_PS
    // write PostScript.
    wfp = fopen("output.eps", "wb");
    if(wfp == NULL){
        error("write EPS error!\n");
        goto end;
    }

    if(fwrite(ps_buf, sizeof(char), header.ps_length, wfp)
       != header.ps_length){
        error("write EPS error!\n");
        goto end;
    }

    fclose(wfp);
#endif // WRITE_PS

    // write TIFF.
    strcpy(tiff_filename, argv[1]);
    strcat(tiff_filename, ".tiff");
    wfp = fopen(tiff_filename, "wb");
    if(wfp == NULL){
        error("write TIFF error!\n");
        goto end;
    }

    if(fwrite(tiff_buf, 1, header.tiff_length, wfp) != header.tiff_length){
        error("write TIFF error!\n");
        goto end;
    }

    fclose(wfp);

end:
    if(wfp != NULL){
        fclose(wfp);
        wfp = NULL;
    }

    if(fp != NULL){
        fclose(fp);
        fp = NULL;
    }

    if(ps_buf != NULL){
        free(ps_buf);
        ps_buf = NULL;
    }

    if(tiff_buf != NULL){
        free(tiff_buf);
        tiff_buf = NULL;
    }

    return 0;
}

void error(const char* msg)
{
    fprintf(stderr, msg);
}

名前:宮内 はじめ

Code for Nagoya名誉代表

E2D3名古屋支部長

プログラマーです。GISやデータビズが好きです。このサイトは宮内の個人的なメモです。

プロフィール

お問い合わせ