容量が増えて中身も増えた / EPSファイルのTIFFプレビューを取り出す
投稿日: 2005年11月07日 更新日: 2017年07月22日
容量が増えて中身も増えた
現在の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やデータビズが好きです。このサイトは宮内の個人的なメモです。