Добавление информации о клипе к изображению - PullRequest
9 голосов
/ 06 июня 2019

Я пытаюсь добавить обтравочный контур к изображению TIFF.Я сделал один TIFF файл с GIMP, который содержит обтравочный контур, и я могу обрезать свое изображение, используя его, с помощью

$img = new Imagick("./test.tiff");
$img->clipPathImage("#1", false);

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

Я пробовал с ImagickDraw, pathStart ... pathFinish, но он рисует что-то на изображении не как путь, который я вижу в GIMP, например

enter image description here

Редактировать: Решения на других языках приветствуются.

Ответы [ 2 ]

2 голосов
/ 16 июня 2019

После публикации предыдущего ответа, основанного на Java, мне стало интересно, можно ли было написать сценарий gimp таким образом, чтобы делать то, что мы хотим. Оказывается, это возможно и довольно просто!

Сначала установите следующий подключаемый модуль gimp, который загружает изображение, рисует путь, а затем сохраняет изображение в формате tif. Скопируйте его в папку с плагинами GIMP. На Mac это ~/Library/Application Support/GIMP/2.10/plug-ins/addpath.py. Создайте папку plug-ins, если она еще не существует. Также убедитесь, что файл python исполняется пользователем, который запускает gimp (chmod u+x addpath.py).

#!/usr/bin/env python

from gimpfu import pdb, main, register, PF_STRING

def add_path(infile, outfile):
    image = pdb.gimp_file_load(infile, 'image')
    vectors = pdb.gimp_vectors_new(image, 'clippath')
    w = image.width
    h = image.height
    path = [
        # The array of bezier points for the path.
        # You can modify this for your use-case.
        # This one draws a rectangle 10px from each side.
        # Format: control1-x, control1-y, center-x, center-y, control2-x, control2-y
        10, 10, 10, 10, 10, 10,
        w - 10, 10, w - 10, 10, w - 10, 10,
        w - 10, h - 10, w - 10, h - 10, w - 10, h - 10,
        10, h - 10, 10, h - 10, 10, h - 10
    ]
    pdb.gimp_vectors_stroke_new_from_points(vectors, 0, len(path), path, True)
    pdb.gimp_image_add_vectors(image, vectors, 0)
    drawable = pdb.gimp_image_get_active_layer(image)
    pdb.file_tiff_save(image, drawable, outfile, 'image.tif', 0)

args = [(PF_STRING, 'infile', 'GlobPattern', '*.*'), (PF_STRING, 'outfile', 'GlobPattern', '*.*')]
register('python-add-path', '', '', '', '', '', '', '', args, [], add_path)

main()

После этого вы можете запустить gimp без пользовательского интерфейса в пакетном режиме, запустив плагин.

gimp -i -b '(python-add-path RUN-NONINTERACTIVE "/absolute/path/to/your/input/file.png" "/absolute/path/to/the/tif/file.tif")' -b '(gimp-quit 0)'

Без второго -b '(gimp-quit 0)' гимп продолжает бегать. Вы также можете попросить gimp прочитать командные команды из stdin. Таким образом, он остается открытым, и вы можете отправлять ему новые команды «add-path», просто написав в stdin.

gimp -i -b -

1 голос
/ 15 июня 2019

Этот ответ о том, как это можно сделать на Java. К сожалению, не существует готового решения на 100%, и некоторые вещи вам необходимо реализовать самостоятельно.

Расширение обтравочного контура для TIFF - это собственное расширение от Adobe. В основном они используют собственный тег TIFF (34377/Photoshop) для хранения элемента пути Photoshop вдоль исходных данных изображения.

В библиотеке изображений TwelveMonkeys есть реализация для чтения формата пути Photoshop, также непосредственно из TIFF Images.

К сожалению, в нем отсутствует поддержка записи данных о путях в фотошопе. Это та часть, которую вы должны реализовать сами. Вот соответствующий код для чтения данных пути . Формат также довольно хорошо задокументирован здесь . В зависимости от вашего варианта использования вам может не понадобиться реализовывать поддержку записи полного пути, а только те части, которые вам нужны.

Вот хороший пост о написании многослойных изображений TIFF, который содержит информацию о том, как окончательное изображение может быть построено и написано на Java.

...