Lightning Talk Script
for hokkaido.pm Casual #3
         in July 18th, 2012
Perl でファイル入出力?
   お、やったことあるぞ。
   というか、実際そればっかりだし。
   しかし、「全部自分で書く派」だから、
    皆さんの役に立つかなぁ?
   でも、ここを逃したら、「自己紹介」し
    かないぞ。

   しょうがない。やってまえ。
TAB 区切りデータから BMP を作
る
   業務でやったこと。
   タックシール印刷アプリの関係。
   寸法データから、見本用の Thumbnail 画
    像を生成する作業。
   年2~3回データを更新する都度、実施
    する。
   タックシールの寸法データは 2000 件を越
    えるので、手で描いていたら終わらない
    。
入力ファイル
入力ファイルの項目
   #0   メーカー名        #10   1 片縦
   #1   メーカーコード      #11   1 片横
   #2   型番           #12   上余白
   #3   用紙サイズ名       #13   下余白
   #4   用紙縦          #14   左余白
   #5   用紙横
                      #15   右余白
   #6   面数
   #7   縦の面数
                      #16   上下間隔
   #8   横の面数
                      #17   左右間隔
   #9   1片のサイズ       #18   登録日
要求仕様
   「タックシール設定」フォルダ以下に、
       メーカー名のフォルダを作成して、その中に
        型番をファイル名とする BMP ファイルを作
        成する。
   ビットマップは縦 78pixel× 横 98pixel とす
    る。
   上記のビットマップの中央部分にフィッ
    トするように、タックシール用紙の模式
    図を描く。
出力ファイル
   Device-Independent Bitmap
    ( Windows )
       いわゆる .bmp 形式( Windows DIB とも)
       24bit Color Depth が単純で使いやすい
         先頭 54bytes のヘッダ
         データ部分は、 pixel の RGB 値が青→緑→赤の順

          に
          3 バイト( 24bit )の配列として並んで格納されて
          いる
       これが出力すればあとは画像変換ソフトで、
        どんな形式でも変換可能( jpeg や png も)
設計コンセプト
   図形を見てみると横線と
    縦線と塗りでできている
   縦線は短い横線で表現で
    きる
   塗りは横線をたくさん引
    けば表現できる
   割と単純に実装できそう
当時の設計
1.   全てが 233 という数値を取る 22932 個
     の要素を持つ配列を作る
        RGB 値 ( 233, 233, 233 )のグレー
        縦 78× 横 98pixel×3byte 分の bytes 列
2.   ここに台紙や各紙片を描けばいい
3.   適切にフィットさせるために、縮尺や座
     標系の変換は必要
当時の設計
4.   横線を描く関数
     sub drawLineHolizontal {
       local($posX,$posY,$length,$color,*bitpattern) = @_;
       local($i) = 0;
       $posX = int($posX / $scale);
       $posY = int($posY / $scale);
       $length = int($length / $scale);
       if($length + $posX > $BMP_width) {$length = $BMP_width - $posX;}
       for($i=0;$i<=$length;$i++) {
          $bitpattern[$posY * $BMP_width + $i+ $posX] = $color;
       }
     }
当時の設計
5.   縦線を描く関数
     sub drawLineVertical {
       local($posX,$posY,$length,$color,*bitpattern) = @_;
       $posX = int($posX / $scale);
       $posY = int($posY / $scale);
       $length = int($length / $scale);
       local($i) = 0;
       if($length + $posY > $BMP_height) {$length = $BMP_height - $posY;}
       for($i=0;$i<=$length;$i++) {
          $bitpattern[($posY + $i) * $BMP_width + $posX] = $color;
       }
     }
当時の設計
6.   矩形を描く
        縦線を 2 本、横線を 2 本描く
            さきほどの drawLineVertical() を 2 回呼ぶ
            さきほどの drawLineHolizontal() を 2 回呼ぶ
6.   矩形で塗りつぶす
        横線をいっぱい描く(笑)
            さきほどの drawLineHolizontal() を高さ分呼ぶ
            逆でもいいけど、計算速度的にアレなので
当時の設計
8.   フォルダを掘る
     mkdir(" タックシール設定 ",0755);
     for($i=0;$i<=$#foldername;$i++) {
        mkdir(" タックシール設定 ".$foldername[$i],0755);
     }

8.   ヘッダをつけてバイナリモードで書き出
     す
        binmode($fh); とか
        $buff .= pack(“C*”,$GValue); とか
実行結果
C:>perl makedata.pl tacklist.dat
アピカ
エイブリィマクセル
エーワン
エレコム
コクヨ
サンワサプライ
ナカバヤシ
ナナクリエイト
ニチバン
パピア・プラッツ
ヒサゴ
プラス
ライオン事務器
その他

C:>
皆さんはどうやる ?
A)   Image::Magick
B)   Imager
C)   Image::Imlib2
ありがとうございました

Hokkaido.pm.casual #03 slide

  • 1.
    Lightning Talk Script forhokkaido.pm Casual #3 in July 18th, 2012
  • 2.
    Perl でファイル入出力?  お、やったことあるぞ。  というか、実際そればっかりだし。  しかし、「全部自分で書く派」だから、 皆さんの役に立つかなぁ?  でも、ここを逃したら、「自己紹介」し かないぞ。  しょうがない。やってまえ。
  • 3.
    TAB 区切りデータから BMPを作 る  業務でやったこと。  タックシール印刷アプリの関係。  寸法データから、見本用の Thumbnail 画 像を生成する作業。  年2~3回データを更新する都度、実施 する。  タックシールの寸法データは 2000 件を越 えるので、手で描いていたら終わらない 。
  • 4.
  • 5.
    入力ファイルの項目  #0 メーカー名  #10 1 片縦  #1 メーカーコード  #11 1 片横  #2 型番  #12 上余白  #3 用紙サイズ名  #13 下余白  #4 用紙縦  #14 左余白  #5 用紙横  #15 右余白  #6 面数  #7 縦の面数  #16 上下間隔  #8 横の面数  #17 左右間隔  #9 1片のサイズ  #18 登録日
  • 6.
    要求仕様  「タックシール設定」フォルダ以下に、  メーカー名のフォルダを作成して、その中に 型番をファイル名とする BMP ファイルを作 成する。  ビットマップは縦 78pixel× 横 98pixel とす る。  上記のビットマップの中央部分にフィッ トするように、タックシール用紙の模式 図を描く。
  • 7.
    出力ファイル  Device-Independent Bitmap ( Windows )  いわゆる .bmp 形式( Windows DIB とも)  24bit Color Depth が単純で使いやすい  先頭 54bytes のヘッダ  データ部分は、 pixel の RGB 値が青→緑→赤の順 に 3 バイト( 24bit )の配列として並んで格納されて いる  これが出力すればあとは画像変換ソフトで、 どんな形式でも変換可能( jpeg や png も)
  • 8.
    設計コンセプト  図形を見てみると横線と 縦線と塗りでできている  縦線は短い横線で表現で きる  塗りは横線をたくさん引 けば表現できる  割と単純に実装できそう
  • 9.
    当時の設計 1. 全てが 233 という数値を取る 22932 個 の要素を持つ配列を作る  RGB 値 ( 233, 233, 233 )のグレー  縦 78× 横 98pixel×3byte 分の bytes 列 2. ここに台紙や各紙片を描けばいい 3. 適切にフィットさせるために、縮尺や座 標系の変換は必要
  • 10.
    当時の設計 4. 横線を描く関数 sub drawLineHolizontal { local($posX,$posY,$length,$color,*bitpattern) = @_; local($i) = 0; $posX = int($posX / $scale); $posY = int($posY / $scale); $length = int($length / $scale); if($length + $posX > $BMP_width) {$length = $BMP_width - $posX;} for($i=0;$i<=$length;$i++) { $bitpattern[$posY * $BMP_width + $i+ $posX] = $color; } }
  • 11.
    当時の設計 5. 縦線を描く関数 sub drawLineVertical { local($posX,$posY,$length,$color,*bitpattern) = @_; $posX = int($posX / $scale); $posY = int($posY / $scale); $length = int($length / $scale); local($i) = 0; if($length + $posY > $BMP_height) {$length = $BMP_height - $posY;} for($i=0;$i<=$length;$i++) { $bitpattern[($posY + $i) * $BMP_width + $posX] = $color; } }
  • 12.
    当時の設計 6. 矩形を描く  縦線を 2 本、横線を 2 本描く  さきほどの drawLineVertical() を 2 回呼ぶ  さきほどの drawLineHolizontal() を 2 回呼ぶ 6. 矩形で塗りつぶす  横線をいっぱい描く(笑)  さきほどの drawLineHolizontal() を高さ分呼ぶ  逆でもいいけど、計算速度的にアレなので
  • 13.
    当時の設計 8. フォルダを掘る mkdir(" タックシール設定 ",0755); for($i=0;$i<=$#foldername;$i++) { mkdir(" タックシール設定 ".$foldername[$i],0755); } 8. ヘッダをつけてバイナリモードで書き出 す  binmode($fh); とか  $buff .= pack(“C*”,$GValue); とか
  • 14.
  • 15.
    皆さんはどうやる ? A) Image::Magick B) Imager C) Image::Imlib2
  • 16.