簡報檔只能有一個檔案是個人在做簡報的一個原則,所以裏面的動畫檔,基本上都用gif來解決…可是最近一直有gif檔太大,但是縮小又太模糊的困擾發生,只好測試一下看看該怎麼做gif檔比較能夠接受。
本篇重點在於resize jpg圖檔時,記得 -quality 100,圖形才不會糊糊的。
convert -resize 14% -quality 100 input.jpg output.jpg
基本上用到的工具就只是ImageMagick,請自行安裝先…
這是原始圖檔,4600x5500像素…檔案大小1.64MB,這樣的檔案一共44個。
基本上放ppt檔的圖形不需要那麼多像素,full hd 也才1920x1200。何況投影片解析度通常沒那麼高,以1024x768為目標來說,我們把圖形縮 14% 的話就變成644x770的檔案。指令如下:
convert -resize 14% original-1.jpg small-1.jpg
檔案大小被這麼一縮,剩下82k大小,可是圖形變的很糊,字與線條邊邊都會因為壓縮而有雜點…
用下述指令產生gif 檔
convert -loop 30 -delay 25 small-*.jpg anim.gif
做成的檔案大小是10.6mb,真是出人意料之外,因為44個各別的檔案也才3.64mb,怎會做成gif卻變那麼大,而且gif圖形品質當然不會變好哩。
jpeg轉檔時記得不要壓縮
由於jpeg存檔時可以指定是否壓縮,預設都會壓(不過我不知道convert採用的預設值多少),我們可以透過-quality 來決定壓縮值,0-100,100是不壓,所以重新用下述指令縮小圖檔:
convert -resize 14% -quality 100 original-1.jpg small-1.jpg
檔案大小變成約300kb,44個一共13.0mb
用下述指令把jpg合成gif後,檔案變成約9mb大小…又是另一個讓人意外的答案。
convert -loop 30 -delay 25 small-*.jpg anim.gif
註:
convert -loop 30 -delay 25 -quality 100 smail-*.jpg anim.gif
convert -loop 30 -delay 25 -quality 50 smail-*.jpg anim.gif
合成的檔案大小一樣是9mb,懷疑合成gif時沒有用到壓縮,所以quality在合成gif時無做用。
星期二, 12月 25, 2012
星期四, 10月 11, 2012
samba無法進入連結(link)資料夾
因為安全因素,所以samba預設不會讓你進到連結的資料夾。當然,一定有打開的方法,如下:
編輯/etc/samba/smb.conf
找
[global]
如果有這些關鍵字,就把它設成如下,不然就新增。然後/sbin/service smb restart 即可。
follow symlinks = yes
wide links = yes
unix extensions = no
#然後記得還有 selinux 的權限問題, #假如你link到/disk1/cmd 那麼記得執行如下指令打開selinux權限 chcon -t samba_share_t /disk1/cmd
編輯/etc/samba/smb.conf
找
[global]
如果有這些關鍵字,就把它設成如下,不然就新增。然後/sbin/service smb restart 即可。
follow symlinks = yes
wide links = yes
unix extensions = no
#然後記得還有 selinux 的權限問題, #假如你link到/disk1/cmd 那麼記得執行如下指令打開selinux權限 chcon -t samba_share_t /disk1/cmd
星期二, 6月 12, 2012
bash 如何用變數取得變數名稱
中文形容的不恰當,英文比較貼切
bash, how to get variable name from variable
假設bash有如下變數:
st21413=5234.3
st21416=4432.2
st52405=5732.1
所以
echo $st21413 會得到 5234.3
那如果
A=st21413
有沒有什麼方法可以透過A得到5234.3的值?
直覺得想法像是
echo $`$A`
結果得到 $st21413 而非 5234.3 …
正解:
A=st21413
echo ${!A}
即可得到5234.3
如果
B=${!A}
那 B 的值就是 5234.3 囉,即
echo $B 會得到 5234.3
bash, how to get variable name from variable
假設bash有如下變數:
st21413=5234.3
st21416=4432.2
st52405=5732.1
所以
echo $st21413 會得到 5234.3
那如果
A=st21413
有沒有什麼方法可以透過A得到5234.3的值?
直覺得想法像是
echo $`$A`
結果得到 $st21413 而非 5234.3 …
正解:
A=st21413
echo ${!A}
即可得到5234.3
如果
B=${!A}
那 B 的值就是 5234.3 囉,即
echo $B 會得到 5234.3
星期一, 5月 14, 2012
用 ImageMagick 的 convert 合併圖檔
話說生論文的重點在於你有沒有好看的圖…英文不好、論點不佳、結果很慘,只好靠作圖來加分…是這樣嗎。
使用GMT繪圖時,撰寫的scripts習慣以一張圖為一個檔案,並且直接轉成jpg。 可是在論文編排時,常常需要把幾張圖合成一張,然後在圖中附上a,b,c,d。 以前的做法是用power point編排後再存成ps檔,再由ps檔轉成jpg(此時可設定解析度)。 本來以為這樣的做法,解析度可以保持(事實上解析度是很大…可以過論文排版的檢查),不過實際上圖的解析度並沒有很好。 另外的做法是用gimp處理jpg檔,或是保留ps檔使用coreldraw,可是對於不常用這些軟體的我來說很是麻煩。
由於我一直有在使用ImageMagick,尤其是要執行縮小或製作gif檔時使用convert命令的方法很是方便。 當然強大的ImageMagick如果只是要把很有規則(大小一樣有的沒的)的幾張圖重新排列,並加上(a)(b)(c)(d)應該不難,只是我不會,也一直沒空去了解。最近又要排版了,再用回power point實在品質太差(我標準提高了嗎?)。所以只好花點時間研究ImageMagick,哇~簡值是神奇,只要一個指令就可以搞定。 例如我有四張圖如下:
然後透過下面的指令:
很神奇對不對(我是指我能寫出這天書般的指令),只是上面的指令記不起來的啦,下次也保證看不懂的啦。既然已經花點時間去了解ImageMagick裏convert的用法,也相信下次要用時會忘記,只好寫個簡單的scripts幫助記憶,並且希望可以再下次要用時直接取用。如果你有需要就請隨便用,把你的圖搞壞了別怪我就是了。
convert 可以透過( ) 來優先處理,所以下面的邏輯是先對每一張圖加上(a) (b) (c) (d),用-label給文字,-pointsize給大小,-page給位置。另外,圖要合併時是沒間距的,所以透過-border加個白色外框(由-bordercolor設定白色)。
然後用+append把二張做橫向合併,所以每個橫向的合併要再用一個( )
最後把橫向合份好的結果再用-append用垂向合併。大致上是這個意思
convert ( (圖1加字) (圖2加字) +append) ( (圖3加字) (圖4加字) +append ) ) -append outfigname.jpg
scripts的寫法是當然由最裏面的小圖一路往上拓展,內容如下:
使用GMT繪圖時,撰寫的scripts習慣以一張圖為一個檔案,並且直接轉成jpg。 可是在論文編排時,常常需要把幾張圖合成一張,然後在圖中附上a,b,c,d。 以前的做法是用power point編排後再存成ps檔,再由ps檔轉成jpg(此時可設定解析度)。 本來以為這樣的做法,解析度可以保持(事實上解析度是很大…可以過論文排版的檢查),不過實際上圖的解析度並沒有很好。 另外的做法是用gimp處理jpg檔,或是保留ps檔使用coreldraw,可是對於不常用這些軟體的我來說很是麻煩。
由於我一直有在使用ImageMagick,尤其是要執行縮小或製作gif檔時使用convert命令的方法很是方便。 當然強大的ImageMagick如果只是要把很有規則(大小一樣有的沒的)的幾張圖重新排列,並加上(a)(b)(c)(d)應該不難,只是我不會,也一直沒空去了解。最近又要排版了,再用回power point實在品質太差(我標準提高了嗎?)。所以只好花點時間研究ImageMagick,哇~簡值是神奇,只要一個指令就可以搞定。 例如我有四張圖如下:
然後透過下面的指令:
convert \( -page -0-0 \( figure4-a.jpg -page +350+220 -background none -fill black -pointsize 220 label:\(a\) -flatten \) -page -0-0 \( figure4-b.jpg -page +350+220 -background none -fill black -pointsize 220 label:\(b\) -flatten \) -bordercolor black -border 50 +append \) \( -page -0-0 \( figure4-c.jpg -page +350+220 -background none -fill black -pointsize 220 label:\(c\) -flatten \) -page -0-0 \( figure4-d.jpg -page +350+220 -background none -fill black -pointsize 220 label:\(d\) -flatten \) -bordercolor black -border 50 +append \) -append out.jpg就變成這樣一張圖:
很神奇對不對(我是指我能寫出這天書般的指令),只是上面的指令記不起來的啦,下次也保證看不懂的啦。既然已經花點時間去了解ImageMagick裏convert的用法,也相信下次要用時會忘記,只好寫個簡單的scripts幫助記憶,並且希望可以再下次要用時直接取用。如果你有需要就請隨便用,把你的圖搞壞了別怪我就是了。
convert 可以透過( ) 來優先處理,所以下面的邏輯是先對每一張圖加上(a) (b) (c) (d),用-label給文字,-pointsize給大小,-page給位置。另外,圖要合併時是沒間距的,所以透過-border加個白色外框(由-bordercolor設定白色)。
然後用+append把二張做橫向合併,所以每個橫向的合併要再用一個( )
最後把橫向合份好的結果再用-append用垂向合併。大致上是這個意思
convert ( (圖1加字) (圖2加字) +append) ( (圖3加字) (圖4加字) +append ) ) -append outfigname.jpg
scripts的寫法是當然由最裏面的小圖一路往上拓展,內容如下:
figncols=2 fignrows=2 outfigname=out.jpg figname[1]=figure4-a.jpg figname[2]=figure4-b.jpg figname[3]=figure4-c.jpg figname[4]=figure4-d.jpg labelvar[1]="label:\(a\)" labelvar[2]="label:\(b\)" labelvar[3]="label:\(c\)" labelvar[4]="label:\(d\)" labelvar[5]="label:\(e\)" labelvar[6]="label:\(f\)" labelvar[7]="label:\(g\)" labelvar[8]="label:\(h\)" labelvar[9]="label:\(i\)" labelvar[10]="label:\(j\)" labelvar[11]="label:\(k\)" labelvar[12]="label:\(l\)" # ( if rows=3, cols=4, there will have 12 figs) # rows # c fig1 fig2 fig3 # o fig4 fig5 fig6 # l fig7 fig8 fig9 # s fig10 fig11 fig12 # # figtots=`expr $figncols \* $fignrows` pagevar="-page +350+220" # label position in pixel # 下面設定圖與圖中的間隔及顏色,這裏是設黑色,寬度50 bordervar="-bordercolor black -border 50" pointsize="-pointsize 220" # font size in pixel pointvar="$pagevar -background none -fill black $pointsize" for (( i=1; i<=$figtots; i++ )); do a[$i]=`echo " -page -0-0 \( ${figname[$i]} $pointvar ${labelvar[$i]} -flatten \)"` done for (( i=1; i<=$fignrows; i++ )); do b[$i]=`echo "\("` for (( j=1; j<=$figncols; j++ )); do k=`expr \( $i \- 1 \) \* $figncols \+ $j ` b[$i]=`echo "${b[$i]} ${a[$k]}"` done b[$i]=`echo "${b[$i]} $bordervar +append \)"` done c=`echo "convert "` for (( i=1; i<=$fignrows; i++ )); do c=`echo "$c ${b[$i]}"` done c=`echo "$c -append $outfigname"` echo $c echo "the command above is excuting" eval $c echo "done"
星期一, 1月 30, 2012
編譯 ncview
一直以來,都用 fortran 配合 GMT畫模式輸出結果的圖,其實已經很方便了,不過常常還是要改一下script。有時候只想非常快速的看一下結果,(完全不重品質),其實 ncview 算是不錯的軟體。下面是其安裝步驟:
安裝 udunits
export F77=ifort ./configure --prefix=/usr/local/udunits make make check make install make install-html install-pdf
安裝 ncview 除udunits外,至少需要下面的套件
yum install libXaw-devel.x86_64 yum install libXmu-devel.x86_64 yum install libpng-devel.x86_64 ./configure --prefix=/usr/local/ncview --with-udunits2_incdir=/usr/local/udunits/include --with-udunits2_libdir=/usr/local/udunits/lib make make install
訂閱:
文章 (Atom)