Más contenido relacionado
La actualidad más candente (15)
Similar a Hokkaido.pm.casual #03 slide (20)
Hokkaido.pm.casual #03 slide
- 2. Perl でファイル入出力?
お、やったことあるぞ。
というか、実際そればっかりだし。
しかし、「全部自分で書く派」だから、
皆さんの役に立つかなぁ?
でも、ここを逃したら、「自己紹介」し
かないぞ。
しょうがない。やってまえ。
- 3. TAB 区切りデータから BMP を作
る
業務でやったこと。
タックシール印刷アプリの関係。
寸法データから、見本用の Thumbnail 画
像を生成する作業。
年2~3回データを更新する都度、実施
する。
タックシールの寸法データは 2000 件を越
えるので、手で描いていたら終わらない
。
- 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); とか