SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

画像からASCIIアートを自動生成する

画像に最も近い文字を判定する方法


  • X ポスト
  • このエントリーをはてなブックマークに追加

2値画像からアスキーアートを自動生成する

 以上の関数を呼び出すエントリーポイントとなるプログラムは次のようになります。原画像の一部を切り取るSplitBmp関数に渡すyの値が大きい方から小さい順になっていることに注意してください。アスキーアートは左上から作る必要がありますが、DIBSectionの原点は左下にあるためです。

// 白黒ビットマップからアスキーアート作成
// char **ppText : 文字列
// BmpIO *mono   : 白黒ビットマップ
// LOGFONT *pLF  : フォント情報
void CreateAsciiArt(char **ppText,BmpIO *pMono,const LOGFONT *pLF)
{
    if(ppText==NULL || pMono==NULL || pLF==NULL) return;

    DeleteAsciiArt(ppText);

    // フォントのサイズを調べる
    BmpIO charbmp;
    AsciiToBmp(&charbmp,'a',pLF);
    int cw=(int)charbmp.GetWidth();
    int ch=(int)charbmp.GetHeight();

    // ビットマップのサイズ
    int w=(int)pMono->GetWidth();
    int h=(int)pMono->GetHeight();

    DWORD textlen=0;
    HANDLE hHeap=GetProcessHeap();
    (*ppText)=(char*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,textlen+1);

    BmpIO splitbmp;
    int c;

    int x,y;
    for(y=h-1-ch;y+ch>=0;y-=ch)
    {
        for(x=0;x<w;x+=cw)
        {
            // ビットマップの一部を抽出
            SplitBmp(&splitbmp,pMono,x,y,cw,ch);
            // 最適な文字に変換
            c=BmpToAscii(&splitbmp,g_ci);
            (*ppText)[textlen++]=(char)c;
            (*ppText)=(char*)HeapReAlloc(
                hHeap,HEAP_ZERO_MEMORY,*ppText,textlen+1);
        }
        (*ppText)[textlen++]='\n';
        (*ppText)=(char*)HeapReAlloc(
            hHeap,HEAP_ZERO_MEMORY,*ppText,textlen+1);
    }
    (*ppText)[textlen]='\0';
}

// 文字列のメモリを解放
// char **ppText : 文字列
void DeleteAsciiArt(char **ppText)
{
    if(ppText && *ppText)
    {
        HeapFree(GetProcessHeap(),0,*ppText);
        *ppText=NULL;
    }
}

テキストファイルに保存する

 テキストファイルに保存するといってもアスキーアートが格納されている文字列を書き込むだけです。プログラムでは1文字ずつ書き込んでいますが、これは全文字を一気に書き込もうとしたところ、なぜか失敗したためです。

// テキスト形式で保存
// char *filename : ファイル名
// char *text     : 文字列
void SaveText(const char *filename,const char *text)
{
    if(filename==NULL || text==NULL) return;

    FILE *fp=fopen(filename,"w");
    for(int i=0;text[i];i++)
    {
        fprintf(fp,"%c",text[i]);
    }
    fclose(fp);
}

 実行例を次に示します。

原画像
原画像
アスキーアート(MS ゴシック / 標準スタイル / 10pt)
              、 、             A@@Wg                        、            
       、^ 、 _ ^,            gW'    アA、            、゙_`、゙、`<^<-  、       
   -,^^ <->-              。@~ー    、  ウA、               ~- -  >_<、`、     
   ^^` '、^>              gW -  、゙ ^    Wg        ^/,^ーッ> '゙   ><'、      
   ^^^、^、^              W"    ゙・      ` "&                   `、 ` <     
   ^  <`/             。W  ^ -  ,'.       ソk           `、^-/,  . ^ -`    
  、、゙` ^-`          g@%VクVク&>ヘvvvc_・```、  $                    _/^-、    
  ゙              _@@VA//_ニ>ンWVW$SV/"ヘy。   オ               '^  -</<ー゙    
               。@@%%/gWVケW%/ <''ソWggggaWe。オ               ^   -、゙       
             _@@%@YVAム/-゙、<ウWgWAAW//"クWgン@#                     ^  、    
       _gm@@@@@$W%_"/"%ケWWWV"、/V3m/>gW%%WWMg                      `     
   _AW@@W%WW@WWW$&*WWケ"、 ^SWoノagg&/ツVW$@$W゙V@                           
  ハ@$%W@@%$WW%W%カ%`_ヘウムmmgaA/~/WA/`^^<>@WVPYフ@_                         
   @%$WW@@カ3W$W9サAWAwW"/~"クa ___ン%W%$@Wク <゙//W$@&g_                     
    @W%%W@W/@%%&@/<"W*ムg,,_カVVケ%%" <^"W%<ー^g%>・"V$@@A,                  
     W&?@タ*スW2^ン%agoggVVVW%,   /クWAAgAwW>/ノ$W&^/>/'"/W\g                
      フ@/~<"<゙。///ヘウ8j~>` '%WW9WVVー/"4 <%W%WノW&/(、^~ " ~Wg              
        @ム・ ンムa/>/_゙_%WWWWタ/.<"YWg/aンQ、&%%WMッノ%&>^>    ^ ~@g            
        _%@@@W%W$W%%%" ・^/V$a&amaW"YV&M5ノW@@@ ソV゙ ^、       ゚@g          
     _@M@@W$@$W%@-,'/WA*mwAX^/VVa,<<  $  /%@@@g ^^       a   ウ@         
   。@W$%WWWW%W@#WWWW*ケ`ッ"Vwg/゙_"/WYYケ%M,  %W@\$@,`゙、      W,  "@        
  AW"ク/ンVWWWV@% "WA%Va。/。/S@ツ%ク%%QSア/- $  、"W% ウ@g "       Mg  "&       
 @"   "・`@V^^#     ~ZW@@\&%カN@$WW>^゙/゙<クc   ノ$<  #&         @A  ウK      
@evag_  ゙ _ニM"              $@@WV、`  "<>$、 ^<d   % K        "&@, カ,     
     ~~""~~                  $@@/_゙     N>  ^ノ  $  $         V Wg @     
                             $゙~%WA2     &   ノ  @  オ          % $ ゙&    
                             ソ&    "ウWカA_#   オ ノレ  $          "y @ "&   
            、   、             $       & ~#   K U   K           $ カ  ゚W  
   ^  , ` >~  、゙x ー^ 、         @、    d   オ  UVwd  W            { ハ    W 
    ンSVgxッ,,>,/、^,- ,` 、        W,   8   #  」  ~。V      __zeweゥ7 ソム   /"
     //VSウツスASSS/"、 ^、^          W, %    レ  オ   ウVwewVV"~          V。o  
      ^・/メ&VVVX/'>、'><゙、,、        %V    d    k                          
    <ウg&VVS2/゙ 、/、 ゙<` ^` '`^゙_         &    V               、、 、       
     </VVSS2S2Sェ,`    `                4a。。vヘ"                ゙ '`-  ー  

次のページ
HTML形式のアスキーアートを作る

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

ひよこ(ヒヨコ)

職業ゲームプログラマーを志す学生です。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/345 2006/05/26 15:42

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング