印鑑の登録処理について

6月中旬に発表予定のメジャーアップデートに向けて誠意製作中の開発チームです。
今回は、印鑑の登録処理についてご説明します。

印鑑の登録といっても、「せん茶請求書」の操作的な部分ではなく、プログラム部分の説明となります。
そのため、中には難しいと感じられる方もいられるかもしれません。
どうしても知りたいけど、わからなかった、という方は、コメント等を残してくだされば幸いです。

せん茶請求書では、印鑑をPDFに捺印する機能を持っております。
しかし、印鑑画像をただアップロードして、それをPDFに貼り付けるだけとはいきません。
理由は、ごくごく一般的な画像、jpegやpngを貼り付けてしまうと、その後ろの書いてある文字が見えなくなってしまうからです。
そのため、「せん茶請求書」ではプログラム内でアップロードされた画像を、透過させるという処理をとっています。

その操作をしている場所は、
app/models/company.phpとModel/charge.phpのindex_set_dataという関数の中にあります。
どちらも同じ処理になっていますが、今回はcompany.phpを例にとってご説明します。

1:画像の確認

155行目にある、
if($_param[‘Company’][‘image’][‘size’]>0){
if($_param[‘Company’][‘image’][‘size’]<$limit){
印鑑のサイズを確認しています。もしも印鑑がアップロードされていなければ、sizeは0となるので、この処理から外れることになります。
同時に、印鑑の最大サイズを超えていないかどうかも確認しています。初期設定では、1024 * 1024になっています。(これは1メガのファイルのサイズです)
*最大容量はconfig/constants.phpの110行目で設定しています。変えたい場合はそちらを御覧ください。

続いて、そのファイルがちゃんとアップロードされたものかどうかの確認をしています。

それを通ると、今度はファイルの拡張子の判断となります。
せん茶請求書ではpngjpegjpgのみを許可になっていますので、それに正しいかどうかを判断しています。
さらに、それがあっていても、偽装されている可能性すらあるので、その判定をしています。
ここまでして、やっと正しい画像と認識され、処理に入るわけです。

2:画像の作成

アップロードされた画像の縦と横の長さを取得し、
190行目の
$img = imagecreate($width, $height);
取得したサイズで新たに画像を作成します。
ここから先の操作はGDというPHPの画像処理ライブラリを使って行われています。詳しく知りたい方はそちらをお調べください。
192行目から198行目では作成した画像に色を塗り、その色を塗ったところを全て透明にするという処理をしています。
これにより、何も描かれていない透明な画像が出来上がったことになります。

この下地に印鑑を描くのが以降の処理です。
200行目、$color = imagecolorallocate($img, 255, 50, 50);
で印鑑の色を作成しています。今の状況でだいたい赤位になっています。
もしも印鑑の色を変えたい場合には、この数字を変えてください。
*RGBでの設定になっています。

201行目から222行目の処理が一番肝心な部分になります。
アップロードした画像のピクセル一つ一つが何色になっているのか、RGBで取得し、そのRGBが一定の値を超えていれば透明な画像の同じ場所に色を塗るという処理です。

これにより、印鑑が捺印された部分だけをコピーすることができ、透明な画像の上に印鑑の部分だけが描かれた画像の作成がされたことになります。

*作成した画像をDBへと登録するという訳になるのですが、そのままだと容量が大きくサーバーを圧迫してしまうため、バイナリと呼ばれる形式での保存をしています。詳しいことはバイナリについてお調べください。

長くなってしまいましたが、今回のご説明は以上となります。前置きにも書いた通り、少し難しい部分の説明となってしまいましたが、簡単に言ってしまえば、

透明な画像を作り、そこに印鑑を捺印した。

そんなイメージで捉えていただければ大丈夫です。

もしも何を言っているかわからないという方はコメント等で質問してくださればお答えします。
今回は画像を登録する処理についてご説明しました。実は画像を表示するという処理の方でもまた一悶着あるのですが、それについてはまたいずれご説明します。

カテゴリー: チップ, 抹茶請求書 パーマリンク

印鑑の登録処理について への2件のフィードバック

  1. Ken10 のコメント:

    社判の登録の際に内部サーバエラーで登録ができません。。
    解決方法が分かりかねますので、ご教示いただければ幸いです。

    よろしくお願いいたします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*