конвертировать изображения в jpg в make-файле, который имеет различные расширения - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть файлы изображений в папке, которые могут имеют разные способы написания расширения (TIFF, TIF, TIF, GIF, GIF и т. Д. c.).

Я хочу все изображения конвертируются в jpg (с помощью магического могущества). Не преобразованные файлы изображений должны быть впоследствии удалены.

Все должно быть сделано с make-файлом.

Моя попытка на данный момент:

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)}

1 Ответ

1 голос
/ 06 февраля 2020

Я бы предпочел go с отдельным правилом для каждого файла, который необходимо преобразовать, поскольку это помогает выяснить, была ли ошибка или нет, и действовать соответствующим образом. При выполнении всего в al oop, как указано выше a) пропускается любая ошибка (и исходный файл удаляется, даже если преобразование не выполнено) и b) он всегда восстанавливает все файлы, независимо от того, была ли она необходима или нет.

Мой подход заключается в том, чтобы получить все файлы с интересными расширениями, сгенерировать целевые имена и использовать шаблонное правило stati c для каждого целевого файла. Я также генерировал бы предупреждение, если есть два или более входных файла, которые приведут к одному и тому же целевому файлу, поскольку не было четко указано, что следует делать в этой ситуации.

Например:

$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...