flutter:处理多倍图

38 阅读2分钟
#!/bin/bash

# 检查参数数量
if [ $# -ne 2 ]; then
  echo "用法: $0 <源图片目录> <目标图片目录>"
  exit 1
fi

# 获取源目录和目标目录
SOURCE_DIR="$1"
TARGET_DIR="$2"

# 检查源目录是否存在
if [ ! -d "$SOURCE_DIR" ]; then
  echo "错误: 源目录 '$SOURCE_DIR' 不存在"
  exit 1
fi

# 检查目标目录是否存在,如果不存在则创建
if [ ! -d "$TARGET_DIR" ]; then
  echo "目标目录 '$TARGET_DIR' 不存在,正在创建..."
  mkdir -p "$TARGET_DIR"
  if [ $? -ne 0 ]; then
    echo "错误: 无法创建目标目录 '$TARGET_DIR'"
    exit 1
  fi
fi

# 确保2.0x和3.0x目录存在
mkdir -p "$TARGET_DIR/2.0x"
mkdir -p "$TARGET_DIR/3.0x"

# 保存原始IFS并设置新的IFS
OLDIFS="$IFS"

# 处理Ctrl+C信号
trap 'echo -e "\n程序被用户中断"; IFS="$OLDIFS"; exit 0' INT

echo "开始处理图片 (按Ctrl+C退出)"
echo "----------------------------------------"

# 处理单个图片的函数
process_single_image() {
  local src_img="$1"
  local tgt_img="$2"
  local img_type="$3" # 1x, 2x, 3x

  # 根据图片类型设置目标目录和处理后的目标文件名
  if [ "$img_type" == "2x" ]; then
    DEST_DIR="$TARGET_DIR/2.0x"
    BASE_TARGET_IMG="${tgt_img/@2x/}"
  elif [ "$img_type" == "3x" ]; then
    DEST_DIR="$TARGET_DIR/3.0x"
    BASE_TARGET_IMG="${tgt_img/@3x/}"
  else
    DEST_DIR="$TARGET_DIR"
    BASE_TARGET_IMG="$tgt_img"
  fi

  # 确保目标目录存在
  if [ ! -d "$DEST_DIR" ]; then
    echo "创建目标目录: $DEST_DIR"
    mkdir -p "$DEST_DIR"
    if [ $? -ne 0 ]; then
      echo "错误: 无法创建目标目录 '$DEST_DIR'"
      return 1
    fi
  fi

  # 检查目标文件是否已存在
  if [ -f "$DEST_DIR/$BASE_TARGET_IMG" ]; then
    if [ $REPLACE_MODE -eq 1 ]; then
      echo "替换模式:删除已存在的文件 '$DEST_DIR/$BASE_TARGET_IMG'"
      rm "$DEST_DIR/$BASE_TARGET_IMG"
      if [ $? -ne 0 ]; then
        echo "错误: 无法删除已存在的文件"
        return 1
      fi
    else
      echo "🔥错误: 目标文件 '$DEST_DIR/$BASE_TARGET_IMG' 已存在"
      return 1
    fi
  fi

  # 移动并重命名文件
  mv "$SOURCE_DIR/$src_img" "$DEST_DIR/$BASE_TARGET_IMG"
  if [ $? -eq 0 ]; then
    echo "成功: '$SOURCE_DIR/$src_img' -> '$DEST_DIR/$BASE_TARGET_IMG'"
    return 0
  else
    echo "错误: 移动文件失败"
    return 1
  fi
}

while true; do
  # 交互式输入源图片和目标图片名称(使用分号分隔)
  echo "请输入源图片名称和目标图片名称,用分号分隔 (例如: 源图片;目标图片;r): "
  read INPUT

  # 如果用户直接回车,退出循环
  if [ -z "$INPUT" ]; then
    break
  fi

  # 使用IFS分隔符正确读取输入
  IFS=";" read -r SOURCE_BASE TARGET_BASE REPLACE_FLAG <<<"$INPUT"

  # 恢复IFS
  IFS="$OLDIFS"

  # 如果目标名称为空,使用源文件名
  if [ -z "$TARGET_BASE" ]; then
    TARGET_BASE="$SOURCE_BASE"
    echo "目标图片名称为空,将使用源图片名称: $SOURCE_BASE"
  fi

  # 检查是否启用替换模式
  REPLACE_MODE=0
  if [ "$REPLACE_FLAG" = "r" ]; then
    REPLACE_MODE=1
    echo "已启用替换模式:将覆盖已存在的文件"
  fi

  # 处理源文件名
  SOURCE_BASE_NO_EXT="${SOURCE_BASE%.*}" # 移除扩展名
  SOURCE_HAS_EXT=0
  if [[ "$SOURCE_BASE" == *"."* ]]; then
    SOURCE_HAS_EXT=1
  fi

  # 处理目标文件名
  TARGET_BASE_NO_EXT="${TARGET_BASE%.*}" # 移除扩展名
  TARGET_HAS_EXT=0
  if [[ "$TARGET_BASE" == *"."* ]]; then
    TARGET_HAS_EXT=1
  fi

  # 准备不同分辨率的源文件名
  if [ $SOURCE_HAS_EXT -eq 1 ]; then
    # 用户提供了后缀
    SOURCE_1X="$SOURCE_BASE"

    # 提取扩展名
    SOURCE_EXT="${SOURCE_BASE##*.}"
    SOURCE_BASE_ONLY="${SOURCE_BASE%.*}"

    # 构造2x和3x文件名
    SOURCE_2X="${SOURCE_BASE_ONLY}@2x.${SOURCE_EXT}"
    SOURCE_3X="${SOURCE_BASE_ONLY}@3x.${SOURCE_EXT}"
  else
    # 用户没提供后缀,默认为png
    SOURCE_1X="${SOURCE_BASE}.png"
    SOURCE_2X="${SOURCE_BASE}@2x.png"
    SOURCE_3X="${SOURCE_BASE}@3x.png"
  fi

  # 准备目标文件名
  if [ $TARGET_HAS_EXT -eq 1 ]; then
    TARGET_IMG="$TARGET_BASE"

    # 构造带@2x和@3x的目标文件名
    TARGET_EXT="${TARGET_BASE##*.}"
    TARGET_BASE_ONLY="${TARGET_BASE%.*}"
    TARGET_2X="${TARGET_BASE_ONLY}@2x.${TARGET_EXT}"
    TARGET_3X="${TARGET_BASE_ONLY}@3x.${TARGET_EXT}"
  else
    TARGET_IMG="${TARGET_BASE}.png"
    TARGET_2X="${TARGET_BASE}@2x.png"
    TARGET_3X="${TARGET_BASE}@3x.png"
  fi

  # 处理状态标志,检查每种分辨率的文件是否存在
  FOUND_ANY=0

  # 处理1x图片
  if [ -f "$SOURCE_DIR/$SOURCE_1X" ]; then
    FOUND_ANY=1
    process_single_image "$SOURCE_1X" "$TARGET_IMG" "1x"
  fi

  # 处理2x图片
  if [ -f "$SOURCE_DIR/$SOURCE_2X" ]; then
    FOUND_ANY=1
    process_single_image "$SOURCE_2X" "$TARGET_2X" "2x"
  fi

  # 处理3x图片
  if [ -f "$SOURCE_DIR/$SOURCE_3X" ]; then
    FOUND_ANY=1
    process_single_image "$SOURCE_3X" "$TARGET_3X" "3x"
  fi

  # 如果没有找到任何匹配的文件
  if [ $FOUND_ANY -eq 0 ]; then
    echo "错误: 未找到任何匹配的图片 ($SOURCE_1X, $SOURCE_2X, $SOURCE_3X)"
  fi

  # 重新设置IFS为分号,为下一次循环做准备
  IFS=";"
  echo "----------------------------------------"
done

# 恢复IFS
IFS="$OLDIFS"

echo "图片处理完成"
exit 0