Поддерживаемые форматы для вывода libvips CLI в стандартный вывод Windows

#stdout #bmp #image-conversion #vips #heic

#стандартный вывод #bmp #преобразование изображений #vip-персоны #heic

Вопрос:

libvips Я использую для преобразования изображений в более удобный формат и передачи результата другому процессу без записи на диск. HEIC Я могу сделать это, используя PNG в качестве промежуточного формата:

 vips copy input.heic .png
 

Однако следующий процесс в моей цепочке принимает только BMP изображения или необработанные данные RGB. Если я заменю .png на .bmp в приведенной выше команде, я получу эту ошибку:

 input.heic: bad seek to 1811903
VipsForeignSave: ".bmp" is not a known target format
 

Это происходит со многими другими форматами, включая собственный .vips . Преобразование отлично работает со всеми форматами, если я записываю на диск, а не в stdout .

Это поможет преобразовать либо в BMP список целых чисел, либо в список целых чисел с информацией RGB.

Ответ №1:

Вы можете просмотреть набор поддерживаемых форматов с vips -l помощью . Для 8.10 это:

 $ vips -l | grep _target
          VipsForeignSaveCsvTarget (csvsave_target), save image to csv (.csv), priority=0, mono
          VipsForeignSaveMatrixTarget (matrixsave_target), save image to matrix (.mat), priority=0, mono
          VipsForeignSavePpmTarget (ppmsave_target), save to ppm (.ppm, .pgm, .pbm, .pfm), priority=0, rgb
          VipsForeignSaveRadTarget (radsave_target), save image to Radiance target (.hdr), priority=0, rgb
          VipsForeignSavePngTarget (pngsave_target), save image to target as PNG (.png), priority=0, rgba
          VipsForeignSaveJpegTarget (jpegsave_target), save image to jpeg target (.jpg, .jpeg, .jpe), priority=0, rgb-cmyk
          VipsForeignSaveWebpTarget (webpsave_target), save image to webp target (.webp), priority=0, rgba-only
          VipsForeignSaveHeifTarget (heifsave_target), save image in HEIF format (.heic, .heif, .avif), priority=0, rgba-only
 

.v и .raw может быть добавлен в 8.11. .bmp написан imagemagick, а не libvips, и может его не выполнить.

Другой альтернативой является использование чего-то вроде интерфейса Python, pyvips, а не CLI. Например:

 import os
import pyvips

image = pyvips.Image.black(10, 10)
memory = image.write_to_memory()
os.write(1, memory)
 

Запишет необработанные байты (в данном случае 100 нулей) в стандартный вывод в двоичном режиме.

Чтобы использовать BMP вместо этого, вы можете написать:

 memory = image.magicksave_buffer(format="BMP")
 

Комментарии:

1. Этот интерфейс Python интересен, я посмотрю .py , не замедлит ли вызов a мою цепочку. Я не знал об этом подмножестве форматов экспорта для стандартного вывода. Моя интуиция ожидала, что одни и те же форматы смогут записывать в стандартный вывод и на диск. Из любопытства, есть ли какая-либо причина для такого различия?

2. Система записи в filedescriptor была добавлена только в прошлом году, и еще не все было пересмотрено для ее поддержки. pyvips может быть немного быстрее, чем CLI, поскольку нет необходимости в каких-либо временных файлах. libvips — это библиотека потоковой обработки изображений, поэтому, если вы выполняете последовательность операций в одном процессе, все они выполняются одновременно, параллельно и без промежуточных звеньев. Это немного похоже на подключение процессов с помощью каналов, за исключением того, что он также может выполнять такие вещи, как преобразования координат.

3. Некоторые замечания о системе записи в filedescriptor: libvips.github.io/libvips/2019/11/29 /…

4. Очень познавательное чтение! Конечная цель моей работы — функция импорта HEIC для Matlab. Это мой текущий процесс: 1) Matlab вызывает java для выполнения vips copy *.heic .ppm (я нашел прямой вызов vips из Matlab, который требует времени для чтения стандартного вывода), 2) другой вызов Java параллельно считывает буфер стандартного вывода и возвращает данные обратно в Matlab, 3) формат PPM анализируется с помощью кода Matlab иданные RGB преобразуются в матричный формат, понятный Matlab. Как вы думаете, Python может ускорить этот процесс?

5. Некоторая дополнительная информация: сравнение производительности вышеупомянутого процесса со встроенным средством чтения изображений Matlab для популярных форматов изображений привело к тому, что моя libvips оболочка замедлилась в 1,5 ~ 2,5 раза. Единственное исключение — .bmp когда встроенный считыватель в 7 раз быстрее (ух!), Чем мойоболочка. Возможно, мой подход не самый лучший…

Ответ №2:

Не уверен, ищете ли вы обходной путь или надеетесь на обновление программного обеспечения от Джона libvips или что именно.

В любом случае, я просто хотел сказать, что если вам нужен обходной путь для преобразования vips вывода в BMP, вы можете использовать ppmtobmp который является частью пакета NetPBM.

Итак, в файл, который будет:

 vips copy image.heic .ppm | ppmtobmp - > result.bmp
 

и в качестве фильтра потока, без перехода на диск:

 vips copy image.jpg .ppm | ppmtobmp | NextProcess
 

Обратите внимание, что ppm формат на самом деле RGB с 3-4 строками заголовка ASCII в начале, который содержит размеры — попробуйте и посмотрите. Итак, если вы можете найти способ в Windows удалить 3-4 строки ASCII, вы можете получить RGB. Или, если ваше изображение имеет размер 640×480 пикселей со скоростью 3 байта / пиксель, возможно, вы можете найти способ в Windows получить последние (640x480x3) байты файла или потока и таким образом удалить заголовок PPM.

Ключевые слова: HEIC, vips, NetPBM, BMP

Комментарии:

1. Ах, я всегда забываю об ppmtobmp этом, очень аккуратно.

2. Эти два обходных пути — это то, что я искал. Я немного изменил свой код, чтобы манипулировать ppm и извлекать из него RGB, и это творит чудеса. Я не знал ppm , что это такой простой формат для интерпретации. И запись ppm с libvips помощью него тоже чертовски быстрая!