#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
помощью него тоже чертовски быстрая!