在具有各种扩展名的 makefile 中将图像转换为 jpg
convert images to jpg in a makefile which have various extensions
我的文件夹中有图像文件,可能 有不同的扩展名拼写方式(tiff、tif、TIF、gif、GIF 等)。
我希望将所有图像转换为 jpg
(通过 magick mogrify)。
未转换的图像文件应在之后删除。
一切都需要用 makefile 来完成。
我目前的尝试:
RASTERFORMATS = tiff TIFF tif Tif TIf png PNG gif Gif
IMGPATH = workfiles/inserts/figures
figures2jpg: cleanfigures
cd $(IMGPATH) && \
for format in {$(RASTERFORMATS)} ;\
do \
magick mogrify -background white -flatten *.$$format ; \
magick mogrify -quiet -colorspace CMYK -format jpg *.$$format ; \
magick mogrify -quiet -colorspace CMYK -density 1200 -format jpg *.$$format ; \
done
rm $(IMGPATH)/*.{$(RASTERFORMATS)}
我宁愿为每个需要转换的文件制定单独的规则,因为这有助于查明是否存在错误并采取相应措施。当像上面那样循环执行所有操作时,a) 会遗漏任何错误(即使转换失败,源文件也会被删除)和 b) 无论是否需要,它总是重新生成所有文件。
我的方法是获取所有具有有趣扩展名的文件,生成目标名称并为每个目标文件使用静态模式规则。如果有两个或多个输入文件会产生相同的目标文件,我也会生成警告,因为没有明确说明在这种情况下应该做什么。
例如:
$ cat Makefile
RASTERFORMATS := [Pp][Nn][Gg] [GgTt][Ii][Ff]
IMGPATH := images
IMAGES_TO_CONVERT := $(foreach format,$(RASTERFORMATS),$(wildcard $(IMGPATH)/*.$(format)))
$(info Images to convert: $(IMAGES_TO_CONVERT))
IMAGES := $(sort $(addsuffix .jpg,$(basename $(IMAGES_TO_CONVERT))))
$(info Target images: $(IMAGES))
percent := %
.SECONDEXPANSION:
.DELETE_ON_ERROR:
$(IMAGES): %.jpg: $$(filter $$*$$(percent), $(IMAGES_TO_CONVERT))
$(if $(word 2,$^),$(warning Multiple sources for $@, generating from $<))
@echo "$< -> $@"
gm mogrify -background white -colorspace CMYK -density 1200 -format jpg $<
echo rm -f $< # Drop echo if really want to remove input file
.PHONY: figures2jpg
figures2jpg: $(IMAGES)
鉴于以下情况:
$ ls images/
image1.png image2.PNG image2.png image3.gif
示例输出为:
$ make figures2jpg
Images to convert: images/image2.png images/image2.PNG images/image1.png images/image3.gif
Target images: images/image1.jpg images/image2.jpg images/image3.jpg
images/image1.png -> images/image1.jpg
gm mogrify -background white -colorspace CMYK -density 1200 -format jpg images/image1.png
echo rm -f images/image1.png
rm -f images/image1.png
Makefile:16: Multiple sources for images/image2.jpg, generating from images/image2.png
images/image2.png -> images/image2.jpg
gm mogrify -background white -colorspace CMYK -density 1200 -format jpg images/image2.png
gm mogrify: Improper image header (images/image2.png).
Makefile:16: recipe for target 'images/image2.jpg' failed
make: *** [images/image2.jpg] Error 1
注意 image2.jpg
的警告。它还表明错误将阻止删除输入文件。另一个调用将重试,但不会再次生成 image1.jpg
,因为它已经是最新的。
$ make figures2jpg
Images to convert: images/image2.png images/image2.PNG images/image1.png images/image3.gif
Target images: images/image1.jpg images/image2.jpg images/image3.jpg
Makefile:16: Multiple sources for images/image2.jpg, generating from images/image2.png
images/image2.png -> images/image2.jpg
gm mogrify -background white -colorspace CMYK -density 1200 -format jpg images/image2.png
gm mogrify: Improper image header (images/image2.png).
Makefile:16: recipe for target 'images/image2.jpg' failed
make: *** [images/image2.jpg] Error 1
我的文件夹中有图像文件,可能 有不同的扩展名拼写方式(tiff、tif、TIF、gif、GIF 等)。
我希望将所有图像转换为 jpg
(通过 magick mogrify)。
未转换的图像文件应在之后删除。
一切都需要用 makefile 来完成。
我目前的尝试:
RASTERFORMATS = tiff TIFF tif Tif TIf png PNG gif Gif
IMGPATH = workfiles/inserts/figures
figures2jpg: cleanfigures
cd $(IMGPATH) && \
for format in {$(RASTERFORMATS)} ;\
do \
magick mogrify -background white -flatten *.$$format ; \
magick mogrify -quiet -colorspace CMYK -format jpg *.$$format ; \
magick mogrify -quiet -colorspace CMYK -density 1200 -format jpg *.$$format ; \
done
rm $(IMGPATH)/*.{$(RASTERFORMATS)}
我宁愿为每个需要转换的文件制定单独的规则,因为这有助于查明是否存在错误并采取相应措施。当像上面那样循环执行所有操作时,a) 会遗漏任何错误(即使转换失败,源文件也会被删除)和 b) 无论是否需要,它总是重新生成所有文件。
我的方法是获取所有具有有趣扩展名的文件,生成目标名称并为每个目标文件使用静态模式规则。如果有两个或多个输入文件会产生相同的目标文件,我也会生成警告,因为没有明确说明在这种情况下应该做什么。
例如:
$ cat Makefile
RASTERFORMATS := [Pp][Nn][Gg] [GgTt][Ii][Ff]
IMGPATH := images
IMAGES_TO_CONVERT := $(foreach format,$(RASTERFORMATS),$(wildcard $(IMGPATH)/*.$(format)))
$(info Images to convert: $(IMAGES_TO_CONVERT))
IMAGES := $(sort $(addsuffix .jpg,$(basename $(IMAGES_TO_CONVERT))))
$(info Target images: $(IMAGES))
percent := %
.SECONDEXPANSION:
.DELETE_ON_ERROR:
$(IMAGES): %.jpg: $$(filter $$*$$(percent), $(IMAGES_TO_CONVERT))
$(if $(word 2,$^),$(warning Multiple sources for $@, generating from $<))
@echo "$< -> $@"
gm mogrify -background white -colorspace CMYK -density 1200 -format jpg $<
echo rm -f $< # Drop echo if really want to remove input file
.PHONY: figures2jpg
figures2jpg: $(IMAGES)
鉴于以下情况:
$ ls images/
image1.png image2.PNG image2.png image3.gif
示例输出为:
$ make figures2jpg
Images to convert: images/image2.png images/image2.PNG images/image1.png images/image3.gif
Target images: images/image1.jpg images/image2.jpg images/image3.jpg
images/image1.png -> images/image1.jpg
gm mogrify -background white -colorspace CMYK -density 1200 -format jpg images/image1.png
echo rm -f images/image1.png
rm -f images/image1.png
Makefile:16: Multiple sources for images/image2.jpg, generating from images/image2.png
images/image2.png -> images/image2.jpg
gm mogrify -background white -colorspace CMYK -density 1200 -format jpg images/image2.png
gm mogrify: Improper image header (images/image2.png).
Makefile:16: recipe for target 'images/image2.jpg' failed
make: *** [images/image2.jpg] Error 1
注意 image2.jpg
的警告。它还表明错误将阻止删除输入文件。另一个调用将重试,但不会再次生成 image1.jpg
,因为它已经是最新的。
$ make figures2jpg
Images to convert: images/image2.png images/image2.PNG images/image1.png images/image3.gif
Target images: images/image1.jpg images/image2.jpg images/image3.jpg
Makefile:16: Multiple sources for images/image2.jpg, generating from images/image2.png
images/image2.png -> images/image2.jpg
gm mogrify -background white -colorspace CMYK -density 1200 -format jpg images/image2.png
gm mogrify: Improper image header (images/image2.png).
Makefile:16: recipe for target 'images/image2.jpg' failed
make: *** [images/image2.jpg] Error 1