GMT ver.5 で写真整理

f:id:S_E_Hyphen:20180328154804p:plain

上図のように、ファイル名で対応関係を示した写真とグラフ画像が存在します。

これらをA4ポートレートの用紙に配置するスクリプトです。

ちなみに、これらのグラフ画像も 画像ファイルからRGB値を取り出す で出力したRGB値から GMT ver.5 を使用してスペクトルを描画したものです。

 

#/bin/bash
psfile=画像.ps
gmt gmtset MAP_GRID_PEN_PRIMARY 0.2p,#AAAAAA
gmt psbasemap -JX17c/25c -R0/17/0/25 -Bg0.1 -P -K > $psfile
gmt gmtset MAP_GRID_PEN_PRIMARY 1.0p,#000000
gmt psbasemap -JX17c/25c -R0/17/0/25 -Bg1 -P -O -K >> $psfile

y=17 # 画像の下端
for thema in 海 崖 百合
do

# キャプションの上端
y2=`bc -l << _BC_
 $y - 0.1
_BC_`
# 写真画像の貼り付け
gmt psimage ${thema}.jpg -J -R \
   -Dx2.0c/${y}c+r300+w4.064c/7.315c+jBL -O -K >> $psfile
# 写真画像のキャプション
echo 6.064 ${y2} ${thema}.jpg |\
 gmt pstext -J -R \
  -F+jTR+a0.0+f12p,GothicBBB-Medium-UniJIS-UTF8-H,0/0/0\
  -Gwhite -O -K >> $psfile
# グラフ画像の貼り付け
gmt psimage ${thema}_graph.jpg -J -R \
   -Dx7.0c/${y}c+r300+w8.467c/7.315c+jBL -O -K >> $psfile
# グラフ画像のキャプション
echo 15.467 ${y2} ${thema}_graph.jpg |\
 gmt pstext -J -R \
  -F+jTR+a0.0+f12p,GothicBBB-Medium-UniJIS-UTF8-H,0/0/0\
  -Gwhite -O -K >> $psfile

# 画像の下端8cm下げ
y=`expr $y - 8`

done

convert -density 150 -quality 69 画像.ps 画像.jpg

 主目盛1cm、副目盛1mmの方眼紙を作成し、写真を右から2cmに、グラフを右から7cmに配置します。

下から17cm、9cm、1cmの位置に、それぞれのテーマごとに配置します。

ちなみに写真の画素数は480×864、グラフ画像は1000x864です。psimage のw4.064c/7.315cとか、w8.467c/7.315cというオプションにより、解像度300DPIで、アスペクト比も保存されるように設定しています。

f:id:S_E_Hyphen:20180329084841j:plain

例ではconvert コマンドでJPEG画像に変換していますが、この応用として何ページ分も書き出して、PDFファイルにしてしまうことも容易です。

 

画像ファイルからRGB値を取り出す

convert コマンドで各画素のRGB値を取得し、MYSQLを使用して色調加工するというスクリプトです。convert コマンドの使用方法については、

ImageMagickで画像からRGB値を取り出す、またその逆 - Qiita

大変参考にさせて頂きましたので、ほとんど備忘録のようなものです。

 

f:id:S_E_Hyphen:20180324153553j:plain
f:id:S_E_Hyphen:20180324153614j:plain
左:元画像     右:加工後

 

#!/bin/bash
#convert -resize 240x432 photo_org/DSC00097.JPG 崖.jpg
#convert -resize x432 -crop 240x432+50+0 photo_org/DSC00098.JPG 海.jpg
#convert -auto-orient -resize x432 photo_org/P3060023.JPG 椿.jpg
#convert -auto-orient -resize x432 photo_org/P6120012.JPG 百合.jpg
# ImageMagick pixel enumeration: 243,432,255,srgb

for thema in 海 # 画像ファイル
do

temp=`mktemp ./XXXX.tmp`

# JPEG形式を平テキストに変換し、データベース登録
convert ${thema}.jpg txt: |\
 awk -F"[,:)]" 'NR>1{print $1,$2,$3,$4,$5}' |\
 sed -e "s/(//g" |\
 awk '{print $1,$2,$3,$4,$5}' > $temp
mysql image << _SQL_
 drop table if exists ${thema};
 create table ${thema} (
  x int,
  y int,
  r int,
  g int,
  b int
 );
 load data local infile "$temp" 
    into table ${thema}
    fields terminated by " "(x,y,r,g,b);
_SQL_

rm $temp

# XY方向それぞれの画素数を取得
nx=`mysql image -N <<_SQL_
 select max(x)-min(x)+1 from ${thema};
_SQL_`
ny=`mysql image -N <<_SQL_
 select max(y)-min(y)+1 from ${thema};
_SQL_`

# ここで赤画層と緑画層の加工を実施 mysql image << _SQL_ update ${thema} set r=0 where b-r>48; update ${thema} set g=0 where b-g>64; _SQL_ # CONVERTコマンドで使用可能なテキストファイルに変換 printf "# ImageMagick pixel enumeration: %d,%d,255,srgb\n" $nx $ny > ${thema}.txt mysql image -N <<_SQL_ > $temp select x,y,r,g,b from ${thema} order by x,y; _SQL_ cat $temp |\ awk '{printf "%3d,%3d: (%3d,%3d,%3d)\n",$1,$2,$3,$4,$5}' \ >> ${thema}.txt # テキスト形式を再度JPG形式画像に変換 convert ${thema}.txt ${thema}_blue.jpg rm $temp done

ブログのPDF印刷

あるStray Engineer の日記 も今月で100記事を超えました。

過去の記事を、何らかの方法でオフラインでも見ることができるようにしておこうと思ったのですが、一つ一つ印刷するのは面倒です。

そこでwkhtmltopdfコマンドを使用してPDFに変換してしまうことにしました。wkhtmltopdfコマンドは

sudo apt install wkhtmltopdf

で簡単にインストールすることができます。

事前に、はてなブログの「設定→詳細設定→エクスポート」でMT形式のテキストファイルは作成しておいて下さい。ここではシェル変数 export_file がそれにあたります。

 

f:id:S_E_Hyphen:20180320142349p:plain

 

#!/bin/bash

parent_URL="http://s-e-hyphen.hatenadiary.jp/entry/"
export_file=s-e-hyphen.hatenadiary.jp.export.txt

# BASENAMEを含む行をgrepで検索する declare -a line=(\ `cat ${export_file} |\ grep -n "BASENAME" |\ sed -e "s/:.*$//g"`\ ) mysql blog_summary << _SQL_ drop table if exists summary; create table summary( title varchar(100), URL varchar(100), date date ); _SQL_ for (( i=0; i<${#line[*]}; i++ )) do line_title=`expr ${line[$i]} - 1` # タイトルはBASENAMEの1行上 child_URL=`cat ${export_file} | sed -n ${line[$i]}'p' | sed -e "s/^.*: //g"` title=`cat ${export_file} | sed -n ${line_title}'p' | sed -e "s/^.*: //g"` date=`echo ${child_URL} | cut -c1-10` URL=${parent_URL}${child_URL} mysql blog_summary << _SQL_ insert into summary(title,URL,date) value("$title","$URL","$date"); _SQL_ done temp=`mktemp ./XXXX.tmp` mysql -N blog_summary << _SQL_ > $temp select date,URL from summary order by date; _SQL_ while read date URL do wkhtmltopdf ${URL} PDF/${date}.pdf done < $temp rm $temp

カレントディレクトリの一つ下のPDFというディレクトリに”作成日.pdf”という名前でPDFファイルが記事の数だけ作成されます。

ただ後で気づいたのですが、このスクリプトの実行に伴ってカウンターを大量に回してしまっていました。運営さん、ごめんなさい。

GMT ver5 で写真を取り扱う

GMTはベクトル図を描画するのには大変便利ですが、ちょっとしたラスタ画像を貼り付けたいとき、その方法を書いてくれている文書は余り有りませんでした。

まさかできないということはないだろうと調べてみたところ、それらしいものがありました。psimageというモジュールです。

デジカメ写真のEXIF情報からカメラ位置を取得し、UTM53系の日本地図に赤丸を付けたうえで、写真も貼り付けてみました。

そりゃぁ、こういう需要も有りますよね。

f:id:S_E_Hyphen:20180313162718j:plain

#!/bin/bash
psfile=photo.ps
photo=ORIGINAL.JPG
out=photo_small.jpg

# デジカメ写真のままだとサイズが大きいので少し間引く
convert -density 300x300 -resize x600 -quality 69 ${photo} ${out}

# EXIFから緯度・経度の取得
lon=`jhead $photo |\
 grep "GPS Longitude" |\
 awk -F":" '{print $2}' |\
 awk '{print $2,$3,$4}' |\
 sed -e "s/d /:/g" |\
 sed -e "s/m /:/g" |\
 sed -e "s/s//g"`
lat=`jhead $photo |\
 grep "GPS Latitude" |\
 awk -F":" '{print $2}' |\
 awk '{print $2,$3,$4}' |\
 sed -e "s/d /:/g" |\
 sed -e "s/m /:/g" |\
 sed -e "s/s//g"`

gmt gmtset MAP_FRAME_PEN 0.5p,#000000
gmt gmtset MAP_GRID_PEN_PRIMARY 0.5p,#000000
# 海岸線の描画
gmt pscoast -JU53/15c -R133/143/30/38 -Bxag1 -Byag1 -Dh -Glightbrown -Wthinnest \
        -Slightblue -W1p -K -P -Y12c > $psfile
# カメラ位置の描画
echo $lon $lat |\
 gmt psxy -J -R -B  -Sc0.2c -Gred -O -K >> $psfile
printf "%s %s\n%s %s" $lon $lat 136.8 34.0 |\
 gmt psxy -J -R -B -W2p+vb0.3c+g#00000 -O -K >> $psfile

# 写真貼り付け用座標
gmt gmtset MAP_FRAME_PEN 0p,#FFFFFF@0
gmt gmtset MAP_GRID_PEN_PRIMARY 0p,#FFFFFF@0
gmt psbasemap -JX20c/10c -R0/20/0/10 -Bx -By \
    -O -K -Y-3.0c >> $psfile
gmt psimage ${out} -J -R -Dx5.5c/10c+r300+w5.33i/3i+jTL -O -K >> $psfile
# 外部テキストファイルからコメントの取得
cat comment.txt |\
 gmt pstext -J -R -B -Gwhite -F+f12p,GothicBBB-Medium-UniJIS-UTF8-H,0/0/0+jML -O >> $psfile
convert $psfile -density 300x300 -quality 60 -crop 595x595 OUTPUT.jpg