Hokkaido.pm.casual #03 slide

290 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
290
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Hokkaido.pm.casual #03 slide

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

×