はてなダイアリーでテーブルアート
この前の図[id:yshl:20051123]を描いた手順
以下に、作った変換用プログラムのソース(C言語)を載せます。恥ずかしいけど。
バグ:PNM形式の仕様を満たしていない。あと、PBMはバイナリ形式だけ。
使用法
./a.out ファイル名
とかすると標準出力に出力します。
#include<stdio.h> #include<stdlib.h> int gettype(FILE *fp) { char x[4]; fgets(x,4,fp); return x[1]; } void getsize(FILE *fp,int *x, int *y) { fscanf(fp,"%d %d\n",x,y); return; } void skip(FILE *fp) { int c=0; while(c!=EOF && c!='\n'){ c=getc(fp); } return; } void printcolor(int c1,int c2,int c3) { printf("|<span style=\"color:#%02x%02x%02x\">■</span>",c1,c2,c3); return; } void linefeed() { puts("|"); return; } void putpgmascii(FILE *fp, int x, int y) { int j,k,c; for(j=0; j<y; j++){ for(k=0; k<x; k++){ fscanf(fp,"%d\n",&c); printcolor(c,c,c); } linefeed(); } return; } void putppmascii(FILE *fp, int x, int y) { int j,k,c1,c2,c3; for(j=0; j<y; j++){ for(k=0; k<x; k++){ fscanf(fp,"%d\n",&c1); fscanf(fp,"%d\n",&c2); fscanf(fp,"%d\n",&c3); printcolor(c1,c2,c3); } linefeed(); } return; } void putpbmraw(FILE *fp, int x, int y) { int i,j=0, c; while( (c=getc(fp))!=EOF ){ for(i=0;i<8;i++){ if(c&128) printcolor(0,0,0); else printcolor(255,255,255); c <<= 1; c&=255; if((j*8+i+1)%x==0) linefeed(); if(j*8+i+1>=x*y) return; } j++; } return; } void putpgmraw(FILE *fp, int x, int y) { int j,k,c; for(j=0; j<y; j++){ for(k=0; k<x; k++){ c=getc(fp); printcolor(c,c,c); } linefeed(); } return; } void putppmraw(FILE *fp, int x, int y) { int j,k,c1,c2,c3; for(j=0; j<y; j++){ for(k=0; k<x; k++){ c1=getc(fp); c2=getc(fp); c3=getc(fp); printcolor(c1,c2,c3); } linefeed(); } return; } int main(int argc, char *argv[]) { int i,c,type,x,y,temp; FILE *fp; for(i=1;i<argc;i++){ fp=fopen(argv[i],"r"); if(fp==NULL){ perror(argv[i]); continue; } type = gettype(fp); c=getc(fp); if(c=='#'){ skip(fp); }else{ ungetc(c,fp); } getsize(fp,&x,&y); if(type != '4'){ fscanf(fp,"%d\n",&temp); } switch(type){ case '2': putpgmascii(fp, x, y); break; case '3': putppmascii(fp, x, y); break; case '4': putpbmraw(fp, x, y); break; case '5': putpgmraw(fp, x, y); break; case '6': putppmraw(fp, x, y); break; default: break; } fclose(fp); } return 0; }