#!/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