debian: บันทึก imagemagick - convert

แปลงรูปจาก jpg ธรรมดา ไปเป็น jpg แบบ interlace
ใช้คำสั่งคือ
# mkdir temp
# for i in *jpg; do convert $i -interlace line temp/$i ; done

จะได้ไฟล์ jpg ชุดใหม่เข้าไปอยู่ในไดเรกทอรี่ temp
แปลงหลายรูป จาก tif ไปเป็น pdf
# convert -adjoin `ls *.tif` newfile.pdf
เอามาจาก jmetrix : Viewing multiple page tif on Linux
แปลง tif หลายไฟล์ไปเป็น tif ไฟล์เดียวหลายภาพ
$ convert x1.tif x2.tif x3.tif -adjoin newfile.tif
แตก tif แบบหลายภาพ ออกมาเป็นหลายไฟล์ ไฟล์ละหนึ่งหน้า
$ convert x.tif x%d.tif
จะได้ออกมาเป็น x1.tif x2.tif x3.tif
เอามาจาก [magick-users] how to split multi-page tiff into single pages
แปลง tif แบบ 8-bit ไปเป็น 4-bit 256 สี เพื่อลดขนาด และสามารถเปิดใน Windows ได้คล่องตัวขึ้น
เทคนิคคือแปลงเป็น gif ก่อน ไม่งั้นแปลงแล้วเปิดไม่ได้
$ convert x.tif /tmp/x.gif
$ convert /tmp/x.gif -depth 4 x.tif
ไฟล์ tif จาก gimp พิมพ์บน evince ไม่ออก
แก้ด้วยการแปลงเป็น jpg ก่อน แล้วจึงแปลงกลับเป็น tif อีกที
$ convert x.tif /tmp/x.jpg
$ convert /tmp/x.jpg x.tif
อีกกรณีหนึ่ง ที่ใช้งานจริง คืองานที่เป็น tif แบบหลายหน้า เราจะกระจายออกมาก่อน แล้วแก้ไขด้วย gimp แล้วจึงรวมกลับเข้าไป โดยต้องการให้ไฟล์เล็กที่สุด คือเป็น gray 256 สี ขนาดภาพ A4 ที่ความละเอียด 200dpi
$ convert x.tif -quality 100 /tmp/x%d.jpg
หลังจากแก้ไขด้วย gimp เสร็จแล้ว ก็ใช้คำสั่ง
$ convert /tmp/*jpg -geometry 1654 -density 200 -compress lzw -depth 4 -adjoin x.tif
ที่มา : My MCP: ImageMagick convert -geometry weirdness
สแกนหนังสือ ลดขนาดให้มากที่สุด ทำเป็น tiff g4
$ convert infile.jpg -level 40%,85%,0.5 -type bilevel -monochrome -compress group4 outfile.tif
ตัวเลข level black,white,gamma ปรับเอาเองตามสภาพหนังสือที่สแกน
ถ้าเป็นหน้าสี ใช้
$ convert infile.jpg -compress lzw -colors 8 outfile.tif
แล้วแปลงเป็น pdf ด้วย tiff2pdf และรวมด้วย pdfjam
ที่มา : http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=6448

หมายเหตุ
ต้องลงแพกเกจ imagemagick ก่อน
# aptitude install imagemagick

imagemagick: การแก้ไข multiple pages tif

ยังหาโปรแกรมที่ใช้แก้ไขภาพ tif แบบหลายหน้า แบบ Imaging for Windows บนลินุกซ์ไม่ได้
ก็คงต้องใช้แบบบรรทัดคำสั่งไปพลาง ๆ ก่อน

ขั้นตอนคือ
ต้องลง ImageMagick ก่อน
$ sudo aptitude install imagemagick

แตกไฟล์ tif แบบหลายหน้าออกมาเป็น แบบหน้าเดียวหลายไฟล์
$ convert image.tif x%d.tif

แก้ไขหน้าที่ต้องการจากไฟล์ที่แตกออกมาแล้ว ด้วย gimp สมมุติว่าเป็นหน้า 2
$ gimp x2.tif

เมื่อบันทึกเรียบร้อยแล้ว ก็รวมกลับเป็นไฟล์เดียวตามเดิม สมมุติว่ามีทั้งหมด 3 ไฟล์
$ convert x1.tif x2.tif x3.tif -adjoin newimage.tif

ถ้าจะให้บีบอัดด้วย

  • ถ้าเป็นภาพสีหรือสีเทา
    $ convert newimage.tif -compress lzw newimage.tif
  • ถ้าเป็นภาพแบบขาวดำ
    $ convert newimage.tif -compress fax newimage.tif
  • สำหรับการบีบอัดมีพารามิเตอร์คือ None BZip Fax Group4 JPEG JPEG2000 Lossless LZW RLE และ Zip
    ต้องทดลองเลือกใช้ดูให้เหมาะกับประเภทของภาพ

ลยไฟล์ย่อยทิ้ง
$ rm x?.tif

ดูผลได้ด้วย evince
$ evince newimage.tif

อ้างอิง : debian: บันทึก imagemagick - convert

*** โปรดระวัง - ไม่สามารถใช้กับไฟล์ tif ที่มีข้อมูล annotation ได้ ***

update
จากขั้นตอนข้างบน สามารถนำมาเขียนสคริปต์ทำให้ใช้คำสั่งเดียวได้ ดังนี้
สมมุติว่าจะต้องการแก้ไข image.tif ในหน้า 0 และหน้า 1 สั่งจากสคริปต์ว่า
$ d.edittif image.tif 0 1
gimp จะเปิดไฟล์ออกมา 2 ไฟล์ คือหน้าแรก และหน้าที่สอง
หลังจากบันทึกและปิด gimp แล้ว จะได้ไฟล์ image-new.tif ออกมาเป็นภาพที่แก้ไขแล้วพร้อมบีบอัดเรียบร้อย

เนื้อไฟล์ d.edittif มีดังนี้
$ sudo touch /usr/local/bin/d.edittif
$ sudo chmod 755 /usr/local/bin/d.edittif
$ sudo vi /usr/local/bin/d.edittif

#!/bin/bash
# EDIT MULTIPLE PAGES TIF FILE
# PREREQUIST: gimp imagemagick evince

#NAME=${0##*/}
NAME=`basename $0`

USAGE=" Usage: $NAME FILE PAGE0 PAGE1 ...
    ex1: $NAME image.tif 0 1 = Edit file image.tif on PAGE0 and PAGE1"

phelp()
{
    echo "$NAME: edit multiple pages tif.
$USAGE"
}

while getopts "h" opt; do
    case "$opt" in
    h)  phelp; exit 0;;
    *)  echo "$Usage" 1>&2; exit 2;;
    esac
done

shift $((OPTIND - 1))

if [ ! $2 ]; then
    phelp
    exit 1;
fi

TIF=$1
shift

FILE=${TIF%.*}      #STRIP FILENAME

EDITFILE=""
while [ $1 ]; do
    EDITFILE="$EDITFILE ~${FILE}$1.tif"
    shift
done

ALLFILE=`ls ~${FILE}*.tif`

if [ -f $TIF ]; then
    echo "Process $TIF"
    /usr/bin/convert $TIF "~$FILE%d.tif"
    if [ -f "~${FILE}0.tif" ]; then
        #EDIT WITH gimp
        echo "Edit $EDITFILE"
        /usr/bin/gimp $EDITFILE

        #COMPRESS EACH TIF
        for i in $ALLFILE; do
            echo -n "IDENTIFY $i "
            if /usr/bin/identify -verbose $i | grep "Gray: 1-bits"; then
                /usr/bin/convert $i -compress fax $i
            else
                /usr/bin/convert $i -compress lzw $i
            fi
        done

        /usr/bin/convert $ALLFILE -adjoin -compress lzw "$FILE-new.tif" #COMPRESS & JOIN
        /usr/bin/evince "$FILE-new.tif"     #VIEW NEW FILE
        rm $ALLFILE     #DELETE ALL SPLIT FILE
    fi
fi

ลองบนเดเบียน sid ครับ

imagemagick: ทำ annotate ไฟล์ tif

ความจำเป็นบีบบังคับให้ต้องรีบหาโปรแกรมที่สามารถทำ Annotation ไฟล์ tif ให้ได้
จริง ๆ ก็มีโปรแกรมชื่อ Xournal ที่สามารถทำ annotate บน pdf ได้
ซึ่งเราอาจแปลง tif ไปเป็น pdf ก่อน แล้วจึงค่อยลงมือแก้ไข
แต่พบว่าในรุ่นปัจจุบันบน sid คือ 0.3.3 ยังทำ Text annotation ไม่ได้
และรุ่นล่าสุด 0.4 ความสามารถและการใช้งานยังค่อนข้างด้อยกว่าที่ Kodakimg ทำได้อยู่โข

แต่จากครั้งก่อนที่ทำ การแก้ไข multiple pages tif
คราวนี้เลยได้ความคิดว่าถ้าลองเปลี่ยนจาก Gimp มาเป็น Inkscape เราก็จะได้ความสามารถในการทำ annotation จาก inkscape ในแบบที่ก้าวหน้าสุด ๆ

มีปัญหาที่ต้องแก้คือ inkscape ไม่สามารถแก้ไขไฟล์แบบหลายหน้าได้ (แต่ในอนาคตคงมาแน่ ๆ เห็นอยู่ใน wishlist ลำดับต้น ๆ )
ทางแก้แบบชั่วคราวคือ กระจายไฟล์ลงในไดเรคทอรี่ชั่วคราวที่สร้างไว้ แล้วแก้ไขตามไฟล์ที่เราระบุ

อีกปัญหาคือเวลาแปลงกลับจาก svg มาเป็น tif แบบหลายหน้าแล้ว ข้อมูล annotation ที่เราทำไว้ จะถูกแปลงเป็นข้อมูล bitmap ฝังรวมกับไฟล์ tif ไปหมด
ทางแก้ชั่วคราวอีกเหมือนกันคือ ให้คงไดเรกทอรี่ชั่วคราวนี้ไว้ โดยไม่ลบไฟล์ทิ้งเลย เมื่อเวลาเราใช้คำสั่ง annotate ครั้งใหม่ เขาก็จะมาแก้ไขต่อจากที่เราเคยแก้เอาไว้ โดยต้องยอมรกรุงรังบ้าง

เนื้อแบตช์ไฟล์มีดังนี้
$ sudo vi /usr/local/bin/d.tifannotate

#!/bin/bash
# ANNOTATE MULTIPLE PAGES TIF FILE
# PREREQUIST: inkscape imagemagick evince

#NAME=${0##*/}
NAME=`basename $0`

USAGE=" Usage: $NAME FILE PAGE0 PAGE1 ...
    ex1: $NAME image.tif 0 1 = Edit file image.tif on PAGE0 and PAGE1"

phelp()
{
    echo "$NAME: annotate multiple pages tif.
$USAGE"
}

while getopts "h" opt; do
    case "$opt" in
    h)  phelp; exit 0;;
    *)  echo "$Usage" 1>&2; exit 2;;
    esac
done

shift $((OPTIND - 1))

if [ ! $2 ]; then
    phelp
    exit 1;
fi

TIF=$1
shift

FILE=${TIF%.*}      #STRIP FILENAME
TEMPDIR="${FILE}~"

EDITFILES=""
while [ $1 ]; do
    EDITFILES="$EDITFILES ${FILE}$1.svg"
    shift
done

INKSCAPE=`which inkscape`
IDENTIFY=`which identify`
CONVERT=`which convert`
VIEW=`which evince`
if [ -f $TIF ]; then
    echo "Process $TIF"
    #TEST TEMP DIR EXIST
    if ! [ -d $TEMPDIR ]; then
        #CREATE TEMP DIR AND SPLIT tif INTO 
        mkdir $TEMPDIR
        $CONVERT $TIF "${TEMPDIR}/$FILE%d.tif"

        #ENTER WORKING TEMP DIR
        pushd $TEMPDIR

        ALLFILE=`ls ${FILE}*.tif`
        #CONVERT TO svg
        for i in $ALLFILE; do
            $INKSCAPE -l "${i%.*}.svg" $i
        done
    else
        #ELSE; EDIT OLD svg
        pushd $TEMPDIR
    fi

    #ANNOTATE   
    if [ -f "${FILE}0.svg" ]; then
        #ANNOTATE WITH inkscape
        echo "Edit $EDITFILES"
        $INKSCAPE $EDITFILES

        ALLSVG=`ls ${FILE}*.svg`
        #CONVERT ADJOIN
        $CONVERT $ALLSVG -adjoin -compress lzw "$FILE-new.tif"  #COMPRESS & JOIN
        $VIEW "$FILE-new.tif"       #VIEW NEW FILE
        mv "$FILE-new.tif" ..
    fi

    #EXIT WORK DIR
    popd

    #REMOVE DIR
    #rm -rf $TEMPDIR
fi

$ sudo chmod 755 /usr/local/bin/d.tifannotate

เรียกใช้งานด้วยคำสั่ง... โปรแกรม ไฟล์tif หน้าที่ต้องการแก้ไข
$ d.tifannotate FILE.tif 0 1 ...
จะได้ไฟล์ที่ทำ annotate แล้วชื่อ FILE-new.tif และไดเรกทอรี่ชั่วคราวชื่อ FILE~ เหลืออยู่ เพื่อใช้ในการแก้ไขครั้งต่อไป (แต่ถ้าไม่ได้ใช้แน่ ๆ ก็อาจเติมคำสั่งลบต่อท้ายแบตช์ไฟล์ หรือลบด้วยมือเอาทีหลังก็ได้ครับ)

กระท่อนกระแท่นหน่อย เพราะเป็นการทำเพื่อรอโปรแกรมลินุกซ์แนวนี้ในอนาคตตัวจริง ก็พอใช้งานได้ไปพลาง ๆ ก่อนครับ

อย่าลืม เปลี่ยนขนาดกระดาษไน inkscape ด้วย

แต่ติดใจการใช้งาน annotation บน inkscape จริง ๆ แฮะ