はてなダイアリーでテーブルアート

この前の図[id:yshl:20051123]を描いた手順

  1. FireFox のアイコンをnetpbmのコマンドでPPM形式に変換
  2. PPM形式からはてなテーブル記法に変換するプログラムを作る
  3. 変換する
  4. 日記に張り付ける

以下に、作った変換用プログラムのソース(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;
}