在具有各种扩展名的makefile中将图像转换为jpg

在具有各种扩展名的makefile中将图像转换为jpg,makefile,imagemagick-convert,Makefile,Imagemagick Convert,我有一个文件夹中的图像文件,它可能有不同的扩展名拼写方式(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

我有一个文件夹中的图像文件,它可能有不同的扩展名拼写方式(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)
样本输出为:

$ 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

当你在命令行上运行这些命令时,它们能工作吗?看起来很好,输出看起来正确(目标图像),但是我得到了错误:
make:gm:没有这样的文件或目录
我在Ubuntu上试用过,它提供了graphicsmagick作为imagemagick的替代品,因此,
gm
从何而来。您可能需要安装它,或者您可以用
magick
替换
gm
,它不会产生更大的影响。好的-没错。我买了macOS,所以它可以与magick mogrify一起使用,非常感谢。
$ 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