ImageMagick常用指令详解

ImageMagick使用手册 ImageMagick是一个用于查看、编辑位图文件以及进行图像格式转换的开放源代码软件套装。它可以读取、编辑超过100种图帧式。ImageMagick以ImageMagick许可证 (页面存档备份,存于互联网档案馆)(一个类似BSD的许可证)发布。 阅读详情

Imagemagick常用指令

(ImageMagick--蓝天白云)

(ImageMagick官网)

(其他比较有价值的IM参考)

(图片自动旋转的前端实现方案)

convert 转换图像格式和大小,模糊,裁剪,驱除污点,抖动,临近,图片上画图片,加入新图片,生成缩略图等。

identify 描述一个或较多图像文件的格式和特性。

composite 根据一个图片或多个图片组合生成图片


举个例子

convert +profile '*' [src]{file}.{ext} -quality 80 -resize '280x140^>' -gravity Center -crop 280x140+0+0 +repage [out]{file}_280x140.{ext}

把一张图片按80的质量去压缩(jpg的压缩参数),同时按图片比例非强制缩放成不超过280x140的图片.居中裁剪280x140,去掉图片裁减后的空白和图片exif信息,通常这种指令是为了保证图片大小正好为280x140

 

下面对各个指令的含义简要说明

 

-quality   图片质量,jpg默认99,png默认75

 

-resize

100x100      高度和宽度比例保留最高值,高比不变

100x100^     高度和宽度比例保留最低值,宽高比不变

100x100!      宽度和高度强制转换,忽视宽高比

100x100>     更改长宽,当图片长或宽超过规定的尺寸

100x100<     更改长宽 只有当图片长宽都超过规定的尺寸

100x100^>   更改长宽,当图片长或宽超过规定的尺寸。高度和宽度比例保留最低值

100x100^<   更改长宽,只有当图片长宽都超过规定的尺寸。高度和宽度比例保留最低值

100             按指定的宽度缩放,保持宽高比例

 x100          按指定高度缩放,保持宽高比

 

-gravity NorthWest, North, NorthEast, West, Center, East,  SouthWest, South, SouthEast截取用的定位指令,定位截取区域在图片中的方位

 

-crop 200x200+0+0 截取用的截取指令 ,在用定位指令后,按后两位的偏移值偏移截取范围左上角的像素后,再按前两位的数值,从左上角开始截取相应大小的图片

 

+repage 去掉图片裁减后的空白


-dissolve 30 设定组合图片透明度dissolve示例


+/-profile * 去掉/添加图片exif信息

下面记录下一些比较复杂一点的指令:

convert +profile '*' [src]{file}.{ext} -quality 90 -resize '700>' /data/tony/watermark_1.png -gravity southeast -compose Dissolve -composite [out]{file}_1024x1024.{ext}

convert +profile '*' [src]{file}.{ext} /data/watermark_1.png -gravity southeast -geometry +10+10 -composite [src]{file}.{ext}

convert +profile '*' [src]{file}.{ext} -coalesce -resize '950x135>' [out]{file}_950x135.{ext}

convert +profile '*' [src]{file}.{ext} -resize '650x500>' miff:- | composite +profile '*' -dissolve 30 -gravity southeast /data/tony/watermark_1.png - [out]{file}_650x500.{ext}

convert [src]{file}.{ext} -quality 80 -resize '190>' -background white -gravity center -extent 190x +repage [out]{file}_width190.{ext}

【/bin/sh^M: bad interpreter: 没有那个文件或目录】
vim filename 
然后用命令 
:set ff? #可以看到dos或unix的字样. 如果的确是dos格式的。 
然后用 
:set ff=unix #把它强制为unix格式的, 然后存盘退出。


###############################################
shell 除法计算
shell计算中使用除法,基本默认上都是整除。
比如:
num1=2
num2=3
num3=`expr $num1 / $num2`
这个时候num3=0 ,是因为是因为expr不支持浮点除法
解决的方法:
num3=`echo "scale=2; $num1/$num2" | bc`
使用bc工具,sclae控制小数点后保留几位
还有一种方法
awk 'BEGIN{printf "%.2f\n",’$num1‘/’$num2‘}'
如果用百分比表示
awk 'BEGIN{printf "%.2f%\n",(’$num1‘/’$num2‘)*100}'

##############################################
convert +profile '*' -size 950x135 xc:#ffffff [src]{file}.{ext} -resize 950x135 -gravity center -compose Src-over -composite [out]{file}_950x135.{ext}
解读:该指令会把gif的动态图拆分成好几张图,


-coalesce
完全定义一个GIF动画序列的每一帧的外观,形成“电影胶片”动画

根据它的-处置元数据覆盖各图像中的图像序列,以再现一个动画中的动画序列中的每个点的外观。有的图片应该是相同的大小,并且为动画继续如预期般GIF动画的工作分配适当的GIF处理设置。这样的帧更容易查看和比高度优化的GIF图像叠加处理。

该动画可以重新优化使用层法“优化”处理后,虽然没有保证恢复的GIF动画优化是比原来更好。

##################################################
gif拿到的只是最后一帧的数据,所以gif的图片在width和height值上有出入
convert +profile '*' tly2.gif -resize "600>" tly2_600.gif
C:\>identify tly2.gif
tly2.gif[0] GIF 341x186 341x186+0+0 8-bit sRGB 256c 191KB 0.000u 0:00.003
tly2.gif[1] GIF 194x173 341x186+128+13 8-bit sRGB 256c 191KB 0.000u 0:00.010
tly2.gif[2] GIF 192x175 341x186+130+11 8-bit sRGB 256c 191KB 0.000u 0:00.013
tly2.gif[3] GIF 80x177 341x186+131+9 8-bit sRGB 256c 191KB 0.000u 0:00.016
...
tly2.gif[30] GIF 164x175 341x186+122+11 8-bit sRGB 256c 191KB 0.000u 0:00.094
tly2.gif[31] GIF 145x172 341x186+122+14 8-bit sRGB 256c 191KB 0.000u 0:00.097
tly2.gif[32] GIF 195x167 341x186+122+19 8-bit sRGB 256c 191KB 0.000u 0:00.100
tly2.gif[33] GIF 196x174 341x186+121+12 8-bit sRGB 256c 191KB 0.000u 0:00.105

 

一、crop_center.sh

如果原图宽>高:按宽*size/高缩放; 如果原图宽<高:按高*size/宽缩放; 并居中裁剪size*size

#!/bin/bash

export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

filename=$1
filename2=$2
size=$3
resize="70"

wh=($(/usr/local/bin/identify -format "%w %h " $1))

if [ ${wh[0]} -gt ${wh[1]} ]
then
resize=$(echo "${wh[0]}*$size/${wh[1]}+1" | bc)
else
resize=$(echo "${wh[1]}*$size/${wh[0]}+1" | bc)
fi

/usr/local/bin/convert +profile "*" -quality 75 -resize ${resize}x${resize} $filename $filename2

/usr/local/bin/convert +profile "*" -gravity Center -crop ${size}x${size}+0+0 $filename2 $filename2

使用范例:/usr/local/bin/crop_center.sh [src]{file}.{ext} [out]{file}_small.{ext} 100

二、tony-convert-1.sh

原图按1024x1024>等比缩放,并打水印于右下角;如果宽高都小于300,则直接使用原图

 

#!/bin/sh

# we have 2 arguments: source file name and dest file name
if [ $# -ne 2 ] ; then 
  echo "Usage: tony-convert-1.sh [source path] [dest path]"
  echo "Example: ./tony-convert-1.sh src/1234.jpg out/1234_100x200.jpg"
  exit 1 
fi

srcFile="$1"
dstFile="$2"

index1=`expr index "${srcFile}" /`
index2=`expr index "${srcFile}" .`
file=`expr substr "${srcFile}" \`expr ${index1} + 1\` \`expr ${index2} - ${index1} - 1\``
ext=`expr substr "${srcFile}" \`expr ${index2} + 1\` \`expr length "${srcFile}" - ${index2}\``

#identify image num
picCount=`/usr/local/sbin/bin/bin/identify ${srcFile}|grep -c "${file}.${ext}"`
echo animate pictures: ${picCount}

if [ ${picCount} -gt 1 ] ; then
  echo "No handle for animate pictures"
  cp ${srcFile} ${dstFile} 
  exit 0 
fi

#identify image size
sizeMatrix=`/usr/local/sbin/bin/bin/identify -format "%wx%h %f\n" ${srcFile}`

index1=`expr index "${sizeMatrix}" x`
width=`expr substr "${sizeMatrix}" 1 \`expr ${index1} - 1\``
echo width: ${width}
index2=`expr \`expr index "${sizeMatrix}" ' '\` - ${index1} - 1`
height=`expr substr "${sizeMatrix}" \`expr ${index1} + 1\` ${index2}`
echo height: ${height}

if [ ${width} -lt 300 ] ; then
  if [ ${height} -lt 300 ] ; then
    echo Image size less than 300x300
    cp ${srcFile} ${dstFile}
    exit 0
  fi
fi

if [ `echo ${ext}|tr 'a-z' 'A-Z'` = "BMP" ] ; then
  index1=`expr index "${dstFile}" .`
  dstFile=`expr substr "${dstFile}" 1 \`expr ${index1} - 1\``.jpg 
fi

#convert image/usr/local/sbin/bin/bin/convert +profile '*' ${srcFile} -resize '1024x1024>' /data/
<span style="font-family:'courier new', courier;font-size: 16px;">tony/watermark_1.png -gravity southeast -compose Dissolve -composite  ${dstFile}</span>

使用范例:/usr/local/sbin/bin/bin/tony-convert-1.sh [src]{file}.{ext} [out]{file}_1024x1024.{ext}

三、resizeByWidthOrHeight.sh:

宽大于高时:定宽等比缩放 高自适应;宽小于高时:定高等比缩放,宽自适应

#!/bin/sh

# we have 2 arguments: source file name and dest file name
if [ $# -ne 3 ] ; then 
  echo "Usage: resizeByWidthOrHeight.sh [source path] [widthxheigth] [dest path]"
  echo "Example: ./resizeByWidthOrHeight.sh src/1234.jpg 150x150 out/1234_150x2150.jpg"
  exit 1 
fi

srcFile="$1"
dstFile="$3"

destSize="$2"
destWidth=${destSize%x*}
destHeight=${destSize#*x}
echo "destSize: ${destWidth}x${destHeight}"

index1=`expr index "${srcFile}" /`
echo "index1: $index1"
index2=`expr index "${srcFile}" .`
echo "index2: $index2"
file=`expr substr "${srcFile}" \`expr ${index1} + 1\` \`expr ${index2} - ${index1} - 1\``
echo "file: $file"
ext=`expr substr "${srcFile}" \`expr ${index2} + 1\` \`expr length "${srcFile}" - ${index2}\``
echo "ext: $ext"
#identify image num
picCount=`/usr/local/sbin/bin/bin/identify ${srcFile}|grep -c "${file}.${ext}"`
echo animate pictures: ${picCount}

if [ ${picCount} -gt 1 ] ; then
  echo "No handle for animate pictures"
  cp ${srcFile} ${dstFile} 
  exit 0 
fi

#identify image size
sizeMatrix=`/usr/local/sbin/bin/bin/identify -format "%wx%h" ${srcFile}`

echo "index1: $index1"
width=${sizeMatrix%x*}
echo width: ${width}
height=${sizeMatrix#*x}
echo height: ${height}

newSize="${destWidth}x${destHeight}"
# width < height
if [ ${width} -lt ${height} ] ; then
  newSize="'x${destHeight}>'"
else
  newSize="'${destWidth}>'"
fi
echo "newSize: ${newSize}"

# resize
resizeCmd="/usr/local/sbin/bin/bin/convert ${srcFile} -quality 100 -resize ${newSize} ${dstFile}"
echo "resizeCmd: ${resizeCmd}"
eval "${resizeCmd}"



使用范例:/usr/local/sbin/bin/bin/resizeByWidthOrHeight.sh [src]{file}.{ext} 594x395 [out]{file}_594x395.{ext}

 

四、tony-convert-2.sh:

缩放规则:

目标图宽<高时:定高等比压缩,宽自适应;

原图宽高比>目标图宽高比时:定高等比压缩,宽自适应;

否则:定宽等比压缩,高自适应

裁剪规则:默认居中,若目标图宽>=高,则居左上角

#!/bin/sh

# we have 2 arguments: source file name and dest file name
if [ $# -ne 3 ] ; then 
  echo "Usage: tony-convert-2.sh [source path] [widthxheigth] [dest path]"
  echo "Example: ./tony-convert-2.sh src/1234.jpg 150x150 out/1234_150x150.jpg"
  exit 1 
fi

srcFile="$1"
dstFile="$3"

destSize="$2"
destWidth=${destSize%x*}
destHeight=${destSize#*x}
echo "destSize: ${destWidth}x${destHeight}"

index1=`expr index "${srcFile}" /`
echo "index1: $index1"
index2=`expr index "${srcFile}" .`
echo "index2: $index2"
file=`expr substr "${srcFile}" \`expr ${index1} + 1\` \`expr ${index2} - ${index1} - 1\``
echo "file: $file"
ext=`expr substr "${srcFile}" \`expr ${index2} + 1\` \`expr length "${srcFile}" - ${index2}\``
echo "ext: $ext"
#identify image num
picCount=`/usr/local/sbin/bin/bin/identify ${srcFile}|grep -c "${file}.${ext}"`
echo animate pictures: ${picCount}

if [ ${picCount} -gt 1 ] ; then
  echo "No handle for animate pictures"
  cp ${srcFile} ${dstFile} 
  exit 0 
fi

#identify image size
sizeMatrix=`/usr/local/sbin/bin/bin/identify -format "%wx%h" ${srcFile}`

echo "index1: $index1"
width=${sizeMatrix%x*}
echo width: ${width}
height=${sizeMatrix#*x}
echo height: ${height}

if [ `echo ${ext}|tr 'a-z' 'A-Z'` = "BMP" ] ; then
  index1=`expr index "${dstFile}" .`
  dstFile=`expr substr "${dstFile}" 1 \`expr ${index1} - 1\``.jpg 
fi

srcRate=$(echo "scale=9; $width*1.0 / $height*1.0" | bc)
destRate=$(echo "scale=9; $destWidth*1.0 / $destHeight*1.0" | bc)

echo "srcRate: ${srcRate}"
echo "destRate: ${destRate}"

resizeCmd="/usr/local/sbin/bin/bin/convert +profile '*' ${srcFile} -resize '${destWidth}x${destHeight}^>' -grAvity Center -crop ${destWidth}x${destHeight}+0+0 +repage ${dstFile}"
newSize="${destWidth}x${destHeight}"
# width < height
if [ ${destWidth} -lt ${destHeight} ] ; then
  newSize="x${destHeight}>"
elif [ `echo "${srcRate} > ${destRate}" | bc` -eq 1 ] ; then
  newSize="x${destHeight}>"
else
  newSize="${destWidth}>"
fi

grAvityWay="Center"
# width < height
if [ ${destWidth} -ge ${destHeight} ] ; then
  grAvityWay="NorthWest"
fi

# resize
resizeCmd="/usr/local/sbin/bin/bin/convert +profile '*' ${srcFile} -resize '${newSize}' -grAvity ${grAvityWay} -crop ${destWidth}x${destHeight}+0+0 +repage ${dstFile}"
echo "resizeCmd: ${resizeCmd}"
eval "${resizeCmd}"


使用范例:/usr/local/sbin/bin/bin/tony-convert-2.sh [src]{file}.{ext} 170x105 [out]{file}_170x105.{ext}

 

五、tony-convert-3.sh: 
以destWidth表示目的图宽,destHeight表示目的图高,persentSize=destWidth/destHeight表示目的图宽高比;
当原图宽<destWidth且高<destHeight时,不截取,直接上传; 
当原图宽<destWidth,高>destHeight时,以原图宽为宽居中裁剪 竖图; 
当原图宽>destWidth,高<destHeight时,以原图高为高居中裁剪 横图; 
当原图宽>destWidth,高>destHeight, 
{

当原图宽/高>persentSize时,将原图高压缩为destHeight居中裁剪 
当原图宽/高<persentSize时,将原图宽压缩为destWidth居中裁剪

}


!/bin/sh

# we have 2 arguments: source file name and dest file name
if [ $# -ne 3 ] ; then 
  echo "Usage: tony-convert-3.sh [source path] [widthxheigth] [dest path]"
  echo "Example: ./tony-convert-3.sh src/1234.jpg 750x375 out/1234_750x375.jpg"
  exit 1 
fi

srcFile="$1"
dstFile="$3"

destSize="$2"
destWidth=${destSize%x*}
destHeight=${destSize#*x}
echo "destSize: ${destWidth}x${destHeight}"

index1=`expr index "${srcFile}" /`
echo "index1: $index1"
index2=`expr index "${srcFile}" .`
echo "index2: $index2"
file=`expr substr "${srcFile}" \`expr ${index1} + 1\` \`expr ${index2} - ${index1} - 1\``
echo "file: $file"
ext=`expr substr "${srcFile}" \`expr ${index2} + 1\` \`expr length "${srcFile}" - ${index2}\``
echo "ext: $ext"

#identify image num
picCount=`/usr/local/sbin/bin/bin/identify ${srcFile}|grep -c "${file}.${ext}"`
echo animate pictures: ${picCount}

if [ ${picCount} -gt 1 ] ; then
  echo "No handle for animate pictures"
  cp ${srcFile} ${dstFile} 
  exit 0 
fi

#identify image size
sizeMatrix=`/usr/local/sbin/bin/bin/identify -format "%wx%h" ${srcFile}`

echo "index1: $index1"
width=${sizeMatrix%x*}
echo width: ${width}
height=${sizeMatrix#*x}
echo height: ${height}

#if [ `echo ${ext}|tr 'a-z' 'A-Z'` = "BMP" ] ; then
  #index1=`expr index "${dstFile}" .`
  #dstFile=`expr substr "${dstFile}" 1 \`expr ${index1} - 1\``.jpg 
#fi


#newSize="${destWidth}x${destHeight}"
heightPadding="0"
widthPadding="0"
persentSize=`echo "scale=4; ${destWidth}/${destHeight}" | bc`
echo "persentSize: ${persentSize}"

# quality
qualityCmd="/usr/local/sbin/bin/bin/convert ${srcFile} -quality 90 ${dstFile}"
echo "qualityCmd: ${qualityCmd}"
eval "${qualityCmd}"


# width > 750 && height <375  hengTu
if [ ${width} -gt ${destWidth} ] && [ ${height} -lt ${destHeight} ] ; then
  heightPadding=$[ ${destHeight}/2-${height}/2]
  echo heightPadding: ${heightPadding}
  flag=0
# width < 750 && height >375  shuTu
elif [ ${width} -lt ${destWidth} ] && [ ${height} -gt ${destHeight} ] ; then
  widthPadding=$[ ${destWidth}/2-${width}/2 ]
  echo widthPadding: ${widthPadding}
  flag=0
# width > 750 && height >375  resize and crop
elif [ ${width} -gt ${destWidth} ] && [ ${height} -gt ${destHeight} ] && [ $ [ ${width}/${height} ]>${persentSize} ]  ; then
  echo "resize by src's height then crop"
  newSize="'x${destHeight}>'"
  flag=1
elif [ ${width} -gt ${destWidth} ] && [ ${height} -gt ${destHeight} ] && [ $[ ${width}/${height} ]<${persentSize} ]  ; then
  echo "resize by src's width then crop"
  newSize="'${destWidth}>'"
  flag=1
fi
  
echo "newSize: ${newSize}"

# resize
if [ ${flag} -eq 1 ] ; then
  resizeCmd="/usr/local/sbin/bin/bin/convert ${dstFile} -resize ${newSize} ${dstFile}"
  echo "resizeCmd: ${resizeCmd}"
  eval "${resizeCmd}"

  cropCmd="/usr/local/sbin/bin/bin/convert ${dstFile} -gravity Center  -crop ${destSize}+0+0 +repage ${dstFile}"
else
  echo "only crop pic"
  cropCmd="/usr/local/sbin/bin/bin/convert ${dstFile} -gravity Center  -crop ${destSize}+${widthPadding}+${heightPadding} +repage ${dstFile}"
fi

# crop
echo "cropCmd: ${cropCmd}"
eval "${cropCmd}"

使用范例:/usr/local/sbin/bin/bin/tony-convert-3.sh [src]{file}.{ext} 750x375 [out]{file}_750x375.{ext}

 

六、tony-convert-3_bg.sh: 
以destWidth表示目的图宽,destHeight表示目的图高,
当原图宽<destWidth且高<destHeight时,不截取,直接上传;
当原图宽<destWidth,高>destHeight时,以原图宽为宽居中裁剪 树图;
当原图宽>destWidth,高<destHeight时,以原图高为高居中裁剪 横图;
当原图宽>destWidth,高>destHeight,
{
当原图宽>高时,将原图高压缩为destHeight居中裁剪
当原图宽<高时,将原图宽压缩为destWidth居中裁剪
}
所有情况都要居中补白

!/bin/sh

# we have 2 arguments: source file name and dest file name
if [ $# -ne 3 ] ; then 
  echo "Usage: tony-convert-3_bg.sh [source path] [widthxheigth] [dest path]"
  echo "Example: ./tony-convert-3_bg.sh src/1234.jpg 750x375 out/1234_750x375.jpg"
  exit 1 
fi

srcFile="$1"
dstFile="$3"

destSize="$2"
destWidth=${destSize%x*}
destHeight=${destSize#*x}
echo "destSize: ${destWidth}x${destHeight}"

index1=`expr index "${srcFile}" /`
echo "index1: $index1"
index2=`expr index "${srcFile}" .`
echo "index2: $index2"
file=`expr substr "${srcFile}" \`expr ${index1} + 1\` \`expr ${index2} - ${index1} - 1\``
echo "file: $file"
ext=`expr substr "${srcFile}" \`expr ${index2} + 1\` \`expr length "${srcFile}" - ${index2}\``
echo "ext: $ext"

#identify image num
picCount=`/usr/local/sbin/bin/bin/identify ${srcFile}|grep -c "${file}.${ext}"`
echo animate pictures: ${picCount}

if [ ${picCount} -gt 1 ] ; then
  echo "No handle for animate pictures"
  cp ${srcFile} ${dstFile} 
  exit 0 
fi

#identify image size
sizeMatrix=`/usr/local/sbin/bin/bin/identify -format "%wx%h" ${srcFile}`

echo "index1: $index1"
width=${sizeMatrix%x*}
echo width: ${width}
height=${sizeMatrix#*x}
echo height: ${height}

# quality
qualityCmd="/usr/local/sbin/bin/bin/convert ${srcFile} -quality 90 ${dstFile}"
echo "qualityCmd: ${qualityCmd}"
eval "${qualityCmd}"


# width > 750 && height <375  hengTu
flag=0
if [ ${width} -gt ${destWidth} ] && [ ${height} -lt ${destHeight} ] ; then
  heightPadding=$[ ${destHeight}/2-${height}/2]
  echo heightPadding: ${heightPadding}
  flag=0
# width < 750 && height >375  shuTu
elif [ ${width} -lt ${destWidth} ] && [ ${height} -gt ${destHeight} ] ; then
  widthPadding=$[ ${destWidth}/2-${width}/2 ]
  echo widthPadding: ${widthPadding}
  flag=0
# width > 750 && height >375  resize and crop
elif [ ${width} -gt ${destWidth} ] && [ ${height} -gt ${destHeight} ] && [ ${width} -gt ${height} ]  ; then
  echo "resize by src's height then crop"
  newSize="'x${destHeight}>'"
  flag=1
elif [ ${width} -gt ${destWidth} ] && [ ${height} -gt ${destHeight} ] && [ ${width} -lt ${height} ]  ; then
  echo "resize by src's width then crop"
  newSize="'${destWidth}>'"
  flag=1
fi
  
echo "newSize: ${newSize}"

# resize
if [ ${flag} -eq 1 ] ; then
  resizeCmd="/usr/local/sbin/bin/bin/convert ${dstFile} -resize ${newSize} ${dstFile}"
  echo "resizeCmd: ${resizeCmd}"
  eval "${resizeCmd}"
  cropCmd="/usr/local/sbin/bin/bin/convert ${dstFile} -gravity Center -crop ${destSize}+0+0 +repage -background white -compose Copy -gravity center -extent ${destSize} ${dstFile}"
else
  echo "only crop pic"
  cropCmd="/usr/local/sbin/bin/bin/convert ${dstFile} -gravity Center -crop ${destSize}+0+0 +repage -background white -compose Copy -gravity center -extent ${destSize} ${dstFile}"
fi

# crop
echo "cropCmd: ${cropCmd}"
eval "${cropCmd}"


使用范例:【240x240大小,背景补白,1PX灰色边框】 /usr/local/sbin/bin/bin/tony-convert-3_bg.sh [src]{file}.{ext} 240x240 [out]{file}_240x240.{ext}

 

七、tony-convert-4.sh: 

原图宽大于destWidth:
{
高>destHeight时:定宽等比缩放 以原图高为高居中裁剪;
否则:从左上角裁剪
}
原图宽小于destWidth:
{
高>destHeight时:以原图高为高居中裁剪;
否则:从左上角裁剪
}

#!/bin/sh

# we have 2 arguments: source file name and dest file name
if [ $# -ne 3 ] ; then 
  echo "Usage: tony-convert-4.sh [source path] [widthxheigth] [dest path]"
  echo "Example: ./tony-convert-4.sh src/1234.jpg 150x150 out/1234_150x150.jpg"
  exit 1 
fi

srcFile="$1"
dstFile="$3"

destSize="$2"
destWidth=${destSize%x*}
destHeight=${destSize#*x}
echo "destSize: ${destWidth}x${destHeight}"

index1=`expr index "${srcFile}" /`
echo "index1: $index1"
index2=`expr index "${srcFile}" .`
echo "index2: $index2"
file=`expr substr "${srcFile}" \`expr ${index1} + 1\` \`expr ${index2} - ${index1} - 1\``
echo "file: $file"
ext=`expr substr "${srcFile}" \`expr ${index2} + 1\` \`expr length "${srcFile}" - ${index2}\``
echo "ext: $ext"

#identify image num
picCount=`/usr/local/bin/identify ${srcFile}|grep -c "${file}.${ext}"`
echo animate pictures: ${picCount}

if [ ${picCount} -gt 1 ] ; then
  echo "No handle for animate pictures"
  cp ${srcFile} ${dstFile} 
  exit 0 
fi

#identify image size
sizeMatrix=`/usr/local/bin/identify -format "%wx%h" ${srcFile}`

echo "index1: $index1"
width=${sizeMatrix%x*}
echo width: ${width}
height=${sizeMatrix#*x}
echo height: ${height}

#if [ `echo ${ext}|tr 'a-z' 'A-Z'` = "BMP" ] ; then
  #index1=`expr index "${dstFile}" .`
  #dstFile=`expr substr "${dstFile}" 1 \`expr ${index1} - 1\``.jpg 
#fi


newSize="${destWidth}x${destHeight}"
# width < height
if [ ${width} -gt ${destWidth} ] ; then
  newSize="'${destWidth}>'"
  if [ ${height} -gt ${destHeight}] ; then
  heihgtPadding="'${destHeight}/2'"
  else
  heihgtPadding="'0'"
  fi
else
  newSize="'${width}>'"
  if [ ${height} -gt ${destHeight}] ; then
    heihgtPadding="'${destHeight}/2'"
  else
    heihgtPadding="'0'"
  fi
fi

echo "newSize: ${newSize}"

# resize
resizeCmd="/usr/local/sbin/bin/bin/convert ${srcFile} -quality 90 -resize ${newSize} ${dstFile}"
echo "resizeCmd: ${resizeCmd}"
eval "${resizeCmd}"
# add white ground
addWhiteCmd="/usr/local/sbin/bin/bin/convert ${dstFile} -crop ${destSize}+0-${heihgtPadding} +repage ${dstFile}"
echo "addWhiteCmd: ${addWhiteCmd}"
eval "${addWhiteCmd}"


使用范例:【160*120裁剪或居中加水印】/usr/local/sbin/bin/bin/tony-convert-4.sh [src]{file}.{ext} 160x120 [out]{file}_160.{ext}

 

八、tony-convert-5.sh: 

宽大于高时:定宽等比缩放 高自适应;
宽小于高时:定高等比缩放,宽自适应;
并居中补白

#!/bin/sh

# we have 2 arguments: source file name and dest file name
if [ $# -ne 3 ] ; then 
  echo "Usage: tony-convert-5.sh [source path] [widthxheigth] [dest path]"
  echo "Example: ./tony-convert-5.sh src/1234.jpg 150x150 out/1234_150x2150.jpg"
  exit 1 
fi

srcFile="$1"
dstFile="$3"

destSize="$2"
destWidth=${destSize%x*}
destHeight=${destSize#*x}
echo "destSize: ${destWidth}x${destHeight}"

index1=`expr index "${srcFile}" /`
echo "index1: $index1"
index2=`expr index "${srcFile}" .`
echo "index2: $index2"
file=`expr substr "${srcFile}" \`expr ${index1} + 1\` \`expr ${index2} - ${index1} - 1\``
echo "file: $file"
ext=`expr substr "${srcFile}" \`expr ${index2} + 1\` \`expr length "${srcFile}" - ${index2}\``
echo "ext: $ext"
#identify image num
picCount=`/usr/local/bin/identify ${srcFile}|grep -c "${file}.${ext}"`
echo animate pictures: ${picCount}

if [ ${picCount} -gt 1 ] ; then
  echo "No handle for animate pictures"
  cp ${srcFile} ${dstFile} 
  exit 0 
fi

#identify image size
sizeMatrix=`/usr/local/bin/identify -format "%wx%h" ${srcFile}`

echo "index1: $index1"
width=${sizeMatrix%x*}
echo width: ${width}
height=${sizeMatrix#*x}
echo height: ${height}

#if [ ${width} -lt 300 ] ; then
#  if [ ${height} -lt 300 ] ; then
#    echo Image size less than 300x300
#    cp ${srcFile} ${dstFile}
#    exit 0
#  fi
#fi

if [ `echo ${ext}|tr 'a-z' 'A-Z'` = "BMP" ] ; then
  index1=`expr index "${dstFile}" .`
  dstFile=`expr substr "${dstFile}" 1 \`expr ${index1} - 1\``.jpg 
fi
newSize="${destWidth}x${destHeight}"
# width < height
if [ ${width} -lt ${height} ] ; then
  newSize="'x${destHeight}>'"
else
  newSize="'${destWidth}>'"
fi
echo "newSize: ${newSize}"

# resize
resizeCmd="/usr/local/sbin/bin/bin/convert ${srcFile} -quality 80 -resize ${newSize} ${dstFile}"
echo "resizeCmd: ${resizeCmd}"
eval "${resizeCmd}"
# add white ground
addWhiteCmd="/usr/local/sbin/bin/bin/convert ${dstFile} -background white -gravity center -extent ${destSize} -gravity Center -crop ${destSize}+0+0 +repage ${dstFile}"
echo "addWhiteCmd: ${addWhiteCmd}"
eval "${addWhiteCmd}"


使用范例:【正方形图】/usr/local/sbin/bin/bin/tony-convert-5.sh [src]{file}.{ext} 90x90 [out]{file}_90x90.{ext}

原文地址:http://www.cnblogs.com/ITtangtang/p/3951240.html

ImageMagick命令行图片工具:批量实现格式转换与压缩,支持水印添加及GIF动态图合成 它还有个超实用的 “批量处理 + 自定义参数” 功能,比如你想把不同尺寸的图片统一压缩到 “宽度不超过 1000 像素,高度按比例缩放”,不用手动算比例,输 “magick convert 原图片.jpg -resize 1000x 缩放后.jpg”,“1000x” 后面不写高度,软件会自动按原图片的宽高比计算高度,保证图片不会变形。而且它的命令格式很规律,基本都是 “magick convert 输入文件 操作参数 输出文件”,熟悉一次后,就算是新操作,搜一下参数就能上手,新手也能快速用起来。 阅读详情

相关推荐

ImageMagick

ImageMagick是一个功能强大的图像处理工具,提供多种安装方式和编程接口。文章介绍了ImageMagick的三种主要接口(MagickCore、MagickWand和Magick++),并详细说明了在Unix和Windows系统下通过源码安装的步骤。Unix用户可通过命令行配置编译安装,Windows用户需使用Visual Studio IDE。此外还提供了便携版本安装、命令行调用示例以及ImageMagickCOM+对象的使用方法。

赤龙绕月的专栏 1093

ImageMagick 的CMD命令

ImageMagick 的CMD命令

qq_34437757的博客 834

windows下载安装ImageMagick

ImageMagick是一个用于查看、编辑位图文件以及进行图像格式转换的开放源代码软件套装。它可以读取、编辑超过100种图帧式。ImageMagick以ImageMagick许可证 (页面存档备份,存于互联网档案馆)(一个类似BSD的许可证)发布。

Peter Cheung的博客 3994

ImageMagick常用指令详解--缩放固定尺寸

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34417200的博客 990

【Zotero】《纯操作讲解,GPT配置,Zotero标注可视化》- 知识点目录

Temperature分布在。之间,越低输出越稳定;

墨门 3396

运放 + MOS管构成的恒流电路分析及实用环境器件参数选择

恒流电路

五花带点肉 2万+

Imagemagick常用指令

Imagemagick常用指令

jacke121的专栏 2336

ESP32-S3打造离线语音助手:从零部署自定义唤醒词与本地大模型推理【实战指南】

本文详细介绍了如何利用ESP32-S3芯片打造离线语音助手,包括自定义唤醒词训练与本地大模型推理的实战指南。通过硬件架构解析、音频处理优化及性能调优技巧,实现低延迟、高隐私保护的语音交互方案,特别适合智能家居和物联网应用。

weixin_30296405的博客 604

linux imagemagick php,linux下 图片处理 ImageMagick 常用指令的尝试

在日常的工作中,需要进行对图片进行裁剪,缩小,打水印的操作。之前都是使用GD库去操作,现在可以尝试使用ImageMagick对其进行操作。一、安装ImageMagick。我的环境是centos7。yuminstallImageMagick正常安装即可。二、尝试简单的指令操作。网上有许多ImageMagick参数的讲解,我这里就不多赘述了。直接上实例。$file='5.jpg';...

weixin_33055757的博客 277

Excel中如何快速地将成绩按比例来划分为等级?

问题介绍: 记录说明:班级里共有40个人,按最终总平均成绩从高到低划分等级,A等级30%,B等级50%,C等级20%。 部分成绩如下表所示: Excel中相关函数介绍: IF函数 IF函数有三个参数,语法如下: =IF(条件判断, 结果为真返回值, 结果为假返回值) 第一参数是条件判断,比如说“A1=">37”这种,判断TRUE或FALSE。如果判断是TRUE(结果为真)那么IF函数返回值是第二参数,否则(结果为假)返回第三参数。 如果省略了第三参数,则当结果为假时,会返回FALSE。 如果公式

Wendy的博客 1万+

OAI骨关节炎数据集申请与DICOM下载全流程避坑指南

医学影像分析中,DICOM格式是存储与交换CT、MRI等数据的通用标准,其元数据Tag承载着像素间距、层厚等关键物理信息,直接影响定量分析的准确性。在骨关节炎研究领域,OAI数据集因样本量大、随访时间长而成为高价值资源,但获取需通过NDA协议申请,并借助nda-tools命令行工具完成TB级影像的批量下载与断点续传。这一流程涉及浏览器环境配置、DICOM格式转换及Python预处理等工程环节,任一细节疏漏都可能导致数据读取异常或分析偏差。掌握从申请到落地的完整链路,能显著提升医学影像AI研究的效率与可复现性

weixin_30843121的博客 276

moviepy 安装之ImageMagick安装

一、moviepy安装步骤 1、pip install moviepy 2、pip install requests 此时运行moviepy视频剪辑代码,会遇到以下错误: .This error can be due to the fact that ImageMagick is not installed on your computer, or (for Windows users) ...

哈哈哈的博客 7464

Tinder养号防封攻略来了:最新Tinder养号流程和运营攻略

今天,我就来给大家分享一下Tinder养号的具体操作,以及针对Tinder账号被封的一些常见问题为大家做个答疑。

m0_67768117的博客 2万+

ImageMagick子命令composite详解

原贴:http://hi.baidu.com/spager/blog/item/bb7eaf0146247b031c95837c.htmlImageMagick子命令composite详解2008-04-16 17:26为方便直接使用,采用ImageMagick内置图片(rose: 、logo: 、GRANITE: 、NETSCAPE: )演示(可替换为如1

最实用的Linux博客 5958

谁还攥着旧的类加载器:Metaspace OOM 的元数据记账、类卸载条件与泄漏定位解析

MetaSpace区是JVM内存管理中的关键部分,负责存储类元数据。随着Java 8的推出,MetaSpace取代了PermGen区,但其灵活性也带来了新的挑战,尤其是在动态类加载和频繁类更新的场景下,容易导致MetaSpace内存溢出(OOM)问题。本文探讨了MetaSpace OOM的根本原因,包括类加载器泄漏、内存管理不当和GC效率低下等,并提供了一系列调优策略和解决方案,帮助开发者有效排查和防止此类问题的发生,确保应用程序的稳定性和高可用性。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

多模态论文笔记——CogVLM和CogVLM2

本文详细介绍LoRA版本的多模态模型——CogVLM和CogVLM2。在SD3中使用其作为captioner基准模型的原因和优势。

haopinglianlian的博客 2203

ImageMagick之图片裁剪详解

ImageMagick之图片裁剪详解 imagemagick 的 convert 命令通过 crop 参数,可以把一幅大图片分成若干块大小一样的图片,同时也可以在大图上截取一块图片来。命令格式为 convert 原始图片 -crop widthxheight+x+y 目标图片 其中 widthxheight 是目标图片的尺寸,+x+y 是原始图片的坐标,这两组值至少要出现一组,也...

weixin_30698297的博客 1391

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ImageMagick安装使用

下载ImageMagick    http://www.imagemagick.org/script/download.php  找到自己对应的系统版本下载并安装 import com.sun.image.codec.jpeg.ImageFormatException; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.im...

qq_35092224的博客 2335

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

imagemagick图片合成例子

进来接到个需求,老板要求使用imagemagick合成图片,起初提的是直接使用java代码调用指令,后来发现imagemagick有对应的java客户端,不过网上资料不错,官网又被墙了,只能自己摸索着尝试 安装 参考 :https://www.cnblogs.com/yuanermen/p/3300457.html https://www.cnblogs.com/yzeng/p/11569598.html 这里安装在centos6上是验证的,其余系统不确定是否出问题 ...

future_xiaowu的博客 1198

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: ImageMagick简介、GraphicsMagick、命令行使用示例
下一篇: 我的ImageMagick使用心得
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值