shell脚本--自动拼接图片

#!/bin/bash
#source_a=
#mv ./$source_a ./source
#创建目录
mkdir ./config
mkdir ./result
text_one="Report of images"
text_two="Disposal of images"
text_three="Verify of images"


: <<'COMMENT'
变量和目录作用
config 存放过程中的文件目录
source 存放原始数据目录
result 存放最终结果目录
text_one 水印1内容变量
text_two 水印2内容变量
text_three 水印3内容变量

实现功能
1、检索souurce下所有图片文件。并在图片右上角打上水印
2、并将这些按行拼接成一张图片存放到上级目录
3、将这些拼接成一行的图片,按照目录级别拼接成一张图,按列拼接

示意:
例如图片地址是这样
/data/20240720/source/20230611/20335309/上报/20230611155442.jpg
/data/20240720/source/20230611/20335309/上报/20230611155444.jpg
/data/20240720/source/20230611/20335309/处置/1686475446025.jpg
/data/20240720/source/20230611/20333846/上报/20230611101017.jpg
/data/20240720/source/20230611/20333846/上报/20230611101020.jpg
/data/20240720/source/20230611/20333846/上报/20230611101022.jpg
/data/20240720/source/20230611/20333846/处置/54734725-a6a3-44e7-8146-5c40c9ac2120.jpg

首先会拼接成下面的图,相同目录下按行拼接。结果保存在下面
/data/20240720/result/20230611/20335309/上报/a_lint_***.jpg
/data/20240720/result/20230611/20335309/处置/a_lint_***.jpg
/data/20240720/result/20230611/20333846/上报/a_lint_***.jpg
/data/20240720/result/20230611/20333846/处置/a_lint_***.jpg

然后会将a_lint_***.jpg 拼接成。拼接的结果是按列拼接的。结果保存在下面
/data/20240720/result/20230611/20335309/output_image.jpg
/data/20240720/result/20230611/20333846/output_image.jpg



使用方式:
在脚本的同级目录下创建 source 目录。然后运行脚本即可。或者将目录名赋值给变量source_a

注意事项:
1、convert 命令加水印时,如果水印内容是中文。则会出现添加失败的现象。但是命令不会报错
2、对磁盘空间又要求。处理过程中需要图片内容的四倍空间,如 需要处理的图片是 	1GB,则磁盘需要 3GB 才能处理完成。处理完后会释放大约 1GB 空间。因为保留了拼接成一行的图片内容和原始数据。所以只能释放 1GB
3、水印这里暂时我只有三个不同类别的水印需求,后续如果新增类别。考虑使用函数优化整个脚本
COMMENT


#获取所有源数据目录和文件信息,只打印出来处置、核查、上报三种目录
find ./ -type f -exec readlink -f {} \; | grep -e 上报 -e 处置 -e 核查 -e 核实 > ./config/result_source.txt

#清除两个文件中的垃圾数据,如:mp3 mp4
sed -i '/.mp3/d' ./config/result_source.txt
sed -i '/.mp4/d' ./config/result_source.txt
sed -i '/.txt/d' ./config/result_source.txt
sed -i '/.TXT/d' ./config/result_source.txt
sed -i '/.doc/d' ./config/result_source.txt
sed -i '/.docx/d' ./config/result_source.txt

#创建结果文件记录内容
cp -rf ./config/result_source.txt ./config/result_result.txt 
sed -i 's/\/source\//\/result\//g' ./config/result_result.txt 


#循环创建目录
#output_image_catalogue.txt 文件,存放将图片拼接成行的图片的存放目录
more ./config/result_result.txt | awk -F"/" '{for(i=1;i<NF;i++) printf "%s%s", $i, (i==NF-1 ? RS : FS)}'  | sort | uniq > ./config/output_image_catalogue.txt


output_image_catalogue_num=$(more ./config/output_image_catalogue.txt | wc -l)
for ((i=1;i<=$output_image_catalogue_num;i++))
do
  output_image_catalogue=$(sed -n "${i}p" ./config/output_image_catalogue.txt)
  mkdir -p $output_image_catalogue
done

#从 result_source.txt 中获取文件,进行添加水印的操作。结果按照 result_result.txt 中保存
#计数,控制循环次数
result_result_num=$(more ./config/result_source.txt | wc -l)
for ((i=1;i<=$result_result_num;i++))
do
  input_image=$(sed -n "${i}p" ./config/result_source.txt)
  output_image=$(sed -n "${i}p" ./config/result_result.txt)

  #添加水印,if判断中修改水印判断条件
  if [[ $input_image == *"处置"* ]]
  then 
#   echo "图片"$input_image"是处置图片"
    convert $input_image -fill red -pointsize 40 -gravity NorthEast -annotate +10+50 "$text_two" $output_image
  else 
    if [[ $input_image == *"上报"* ]]
	then
#	  echo "图片"$input_image"是上报图片"
	  convert $input_image -fill red -pointsize 40 -gravity NorthEast -annotate +10+50 "$text_one" $output_image
	else
#	  echo "图片"$input_image"是核查图片"
	  convert $input_image -fill red -pointsize 40 -gravity NorthEast -annotate +10+50 "$text_three" $output_image
	 fi
  fi
  echo "执行拼接操作,当前进度:总共有"$result_result_num"个需要执行,已执行:"$i
done

echo "目录文件处理完毕"
echo "开始拼成一行图"


#拼成一行
#final_result.txt 文件,记录添加上文字后的图片目录,案件级别
more ./config/output_image_catalogue.txt | awk -F"/" '{for(i=1;i<NF;i++) printf "%s%s", $i, (i==NF-1 ? RS : FS)}' > ./config/final_result.txt

#./config/output_image_catalogue.txt


final_result_num=$(more ./config/output_image_catalogue.txt | wc -l)
for ((b=1;b<=$final_result_num;b++))
do
  final_result_a=$(sed -n "${b}p" ./config/output_image_catalogue.txt)
  final_result=$(sed -n "${b}p" ./config/final_result.txt)
  prefix="a_lint"
  filename="${prefix}_${b}.jpg"
  echo "正在将图片拼接成一行,当前进度:总共有"$final_result_num"个需要执行,已执行:"$b
  montage $final_result_a/* -geometry +0+0 -tile x1 -background black $final_result/$filename
done


echo "一行图拼接完毕"
echo "开始拼成一张图"

#拼成一张图
more ./config/final_result.txt | sort | uniq > ./config/final_result_two.txt 

final_result_num_two=$(more ./config/final_result_two.txt | wc -l)
for ((h=1;h<=$final_result_num_two;h++))
do
  final_result_two=$(sed -n "${h}p" ./config/final_result_two.txt)
  echo "删除历史目录"
  echo "rm -rf "$final_result_two/*/
  rm -rf $final_result_two/*/
  echo "执行拼接操作,当前进度:总共有"$final_result_num_two"个需要执行,已执行:"$h
#  echo  "montage "$final_result_two/* "-geometry +0+0 -tile x1 -background black "$final_result_two/"output_image.jpg"
  montage $final_result_two/* -geometry +0+0 -tile 1x -background black $final_result_two/output_image.jpg
done


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值