# Jpegger

Version:0.3.0

Jpegger 是一个批量转换图片格式的脚本。

具有以下特点：

- 可以一次性添加多个来源，并递归地搜索子目录中的源文件
- 支持多种图片格式
- 参数简单，易于使用
- 提供简单的图像处理功能
- 不能自动整理目标文件
- 不能重命名目标文件

目前，Jpegger 所有的功能都使用 pillow 实现。

## 基本用法

使用 `--output` 选项可以指定目标目录，如果不指定，默认使用当前的工作目录。
源文件则直接指定即可，可以指定多个。

```shell
jpegger a.jpg b.png c.gif
# 不指定目标位置则会输出在当前工作目录下
jpegger a.jpg b.png c.gif -o D:/目标目录
# -o 是 --output 的缩写
```

> **注意**: 源文件和目标位置都在当前工作目录时，有可能会产生文件冲突。

使用 `--format` 选项指定目标文件的格式，支持的格式包括：
BMP、EPS、GIF、ICO、IM、JPEG、JPEG 2000、MSP、PCX、PDF、PNG、PPM、SGI、SPI、TGA、TIFF、WEBP、XBM。
默认情况下会转换为 JPEG 格式。
Jpegger 将会自动为目标文件设置扩展名。

```shell
jpegger a.png b.webp -f TGA -o 'tga'
# 将把 a 和 b 两个文件转换为 .tga 格式并保存在当前工作目录的 'tga' 目录中
```

## 以目录作为源文件

如果指定的源文件路径中存在目录，
Jpegger 将会自动将目录展开，并读取其中的文件，**但是将会忽略其中的子目录**。
这是一种较方便的指定源文件的特性。

但是，如果使用了 `--recursive` 参数，
Jpegger 将会逐级展开所有的子目录并将其中的文件添加到计划列表中。

```shell
jpegger 图片合集 -o 目标目录 -r
# -r 是 --recursive 的缩写
```

## 指定输出图像质量

Jpegger 本身定位是以减小文件大小为目的批量转换图片，
所以并不支持无损输出。

默认情况下，Jpegger将使用 80 作为质量参数进行输出。
你也可以使用 `--quality` 参数指定输出质量。

```shell
jpegger -f JPEG -q 50 A.PNG
# -q 是 --quality 的缩写
# 将会转换 A.PNG 文件为质量为 50 的 JPEG 文件
```

## 图像处理器

Jpegger 内置了一系列图像处理器，将会在输出图像保存之前对图像进行处理。
默认情况下，不会启用任何图像处理器。

### 色彩空间转换器

使用 `--color-space` `-c` 参数指定一种目标色彩空间，
如果不设置或使用 "auto"，则会尽量保持源文件的色彩空间。

此选项必须使用合法的色彩空间代码，
支持的色彩空间如下：

| 代码                     | pillow 参数 | 说明                        |
|------------------------|-----------|---------------------------|
| binary                 | 1         | 1-bit 像素，黑和白，存储每个像素 8 个像素 |
| grayscale \| greyscale | L         | 8-bit 像素，黑和白              |
| palette                | P         | 8-bit 像素，使用调色板映射到任何其他模式   |
| rgb                    | RGB       | 3x8-bit 像素，真彩             |
| rgba                   | RGBA      | 4x8-bit 像素，真彩，带透明度掩模      |
| cmyk                   | CMYK      | 4x8-bit 像素，印刷品常用色彩        |
| yuv                    | YCbCr     | 3x8-bit 像素，颜色视频格式         |
| lab                    | LAB       | 3x8-bit 像素                |
| hsv                    | HSV       | 3x8-bit 像素                |
| int32                  | I         | 32-bit 整型像素               |
| float32                | F         | 32-bit 浮点型像素              |
| auto                   | None      | 不指定空间，保留源文件空间             |

```shell
jpegger A.PNG -c grayscale
# 将会把图片转换为黑白图
jpegger B.png -c rgb
# 将会去除原图中的透明度信息
```

> **注意**: 如果需要保留透明度信息，一定要使用 `rgba` 而不是 `rgb`。

### 图像尺寸限制器·前篇

使用 `--max-size` `-s` 参数可以指定一个理想的图像大小，
Jpegger 将会对尺寸过大的图片进行缩放。

参数可以是一个 `数字`，以像素为单位。
默认情况下将会保证图片的最长边不大于此数值，并按原始比例进行缩放。
且尽量不缩放——即如果图片本身没有超出这个数值，则不会进行缩放处理。

```shell
jpegger a.png -s 128
# 将会将图片最长边缩放到128
```

这个参数也可以指定一个 `尺寸` 作为参数。
此时，Jpegger将会保证图片的面积不大于此参数指定的尺寸所表达的面积，
并保持原始画面比例进行缩放。当然——且尽量不缩放。

```shell
jpegger a.jpg -s "1280x576"
jpegger a.jpg -s "1280 576"
jpegger a.jpg -s "1280:576"
# 将会保证图片的面积不大于 737280 (= 1280 x 576)
```

这是一种更灵活的限制图像大小的方法。

### 图像尺寸限制器·后篇

Jpegger 还提供了一个更复杂的选项—— `--resize-mode` `-m`。

这个选项用于强制指定图像缩放的算法，其默认值为 `auto`。
上一章节中描述的特性即此模式下的处理方法。还可以使用其它方法：

| 模式代码 | 说明                                 |
|------|------------------------------------|
| auto | 默认方式：一个数字时限制最长边，两个数字时限制面积          |
| area | 强制限制面积：此时如果只有1个数字作为尺寸参数，则会直接当作面积数值 |
|edge| 强制限制最长边：此时如果制定了一个尺寸作为参数，将会使用其中最长的边长作为限制值|
|crop|强制限制画面尺寸，保持比例缩放并裁切超出部分：必须指定尺寸为参数|
|fit|强制限制画面尺寸，保持比例缩放且保持完整图像：必须指定尺寸为参数，可能出现黑边|
|stretch|强制设置画面尺寸：拉扯画面并填满整个尺寸，可能会变形|
|none|限制画面尺寸，但不进行缩放：如果图片过大，则只会保留中间的部分|

Jpegger 并不是一个精密的图片处理工具，
这些选项只是为了方便在一些要求不高的情况下批量处理图片而设计。

```shell
jpegger a.jpg -s '500*400' -m 'crop'
# 如果原始图片更宽，则左右两侧会裁掉
jpegger a.jpg -s 1000 -m 'area'
# 将会保证图片面积不大于 1000
jpegger a.jpg -s '128 128' -m 'stretch'
# 将会把原图像变形为指定的尺寸： 128 x 128
```

## 测试运行

指定 `--pretend` `-p` 参数可以启用假装模式，
Jpegger 将会处理所有的内容，但是不会真的输出文件。

也可以使用 `--debug` `-d` 参数，将会输出所有工作过程的信息，方便查看。

两个选项可以一起使用。

-----
项目主页: https://gitee.com/xiii_1991/cxalio-studio-tools

作者: xiii_1991@163.com