Как возникает этот вопрос
В настоящее время я разрабатываю инструмент обратного поиска изображений для своей семьи в Windows. Основная концепция проста: используйте модель нейронной сети, такую как MobileNetV3, для извлечения векторов признаков из изображений, сохранения их в базе данных векторов FAISS, а при поиске извлекайте вектор признаков из изображения запроса и находите ближайшие совпадения в FAISS.
Однако речь идет не только о поиске в отдельных файлах изображений. Инструменту необходимо обрабатывать встроенные изображения в PDF-файлах, PPTX-, XLSX-файлах и ужасных старых файлах .xls. PDF-файлами и PPTX можно управлять. XLSX, будучи современным форматом, по сути представляет собой zip-архив — просто разархивируйте и загрузите все из xl/media. Но .xls? Это совсем другая история.
Целевая машина имеет ограниченные характеристики:
- Двухъядерный двухпоточный процессор
- Жесткий диск со скоростью 7200 об/мин
- 12 ГБ оперативной памяти DDR3
- Windows 7
Решения, которые я исследовал
1. Apache POI (Java)
Модуль HSSF в POI предоставляет метод getAllPictures() — несколько строк кода и все готово. Это зрело и надежно. Проблема? Я в основном использую C++, и лично мне работа с Java просто неинтересна.
2. NPOI (C#)
Та же концепция, что и Apache POI, поскольку он является портом, а также имеет метод GetAllPictures(). Но это не соответствует моему технологическому стеку, так что можно.
3. Анализ с помощью xlrd (Python)
Код: Выделить всё
xlrd4. Автоматизация COM с помощью Excel
Это означает, что приложение Excel может открыть файл и выполнить итерацию по объектам Shape для экспорта изображений. Точность первоклассная, поскольку используется официальный парсер. Недостатки существенны: необходимо установить Excel, он работает медленно, а автоматизация COM может быть подвержена сбоям в работе системы. Мне нужна независимая библиотека с открытым исходным кодом и минимальными зависимостями.
5. Преобразование LibreOffice
LibreOffice полностью поддерживает файлы .xls, и существуют инструменты Python, которые могут запускать его в качестве фоновой службы для преобразования. Этот подход имеет те же проблемы, что и вариант 4: он требует установки LibreOffice на компьютере пользователя и перетаскивает среду Python. Размер упаковки, скорее всего, превысит 1 ГБ, что для меня не очень важно.
6. Aspose.Cells (коммерческий)
Это, пожалуй, самая мощная библиотека обработки Excel, доступная на рынке, с поддержкой C++, Java, .NET, Python и других языков. Он предлагает простые API для извлечения всех встроенных объектов, включая изображения, из файлов .xls. Документация и примеры превосходны. Однако коммерческое лицензирование обычно предназначено для корпоративного использования и не подходит для личного хобби-проекта.
7. libxls
Это, пожалуй, самая известная библиотека C для анализа файлов .xls. Его основное внимание уделяется чтению содержимого ячеек и формул. Хотя его внутренняя структура обеспечивает доступ к потокам необработанных данных, он не предоставляет высокоуровневого API или каких-либо примеров для извлечения изображений. Это отличная библиотека для своих задач, но она не отвечает моим конкретным потребностям.
Краткое описание исследования
Все семь вариантов имеют существенные недостатки. Наиболее идеальной технической комбинацией было бы Java + POI, но я просто не могу вникнуть в экосистему и образ мышления Java. Когда я искал собственное решение для C/C++, я не нашел в Интернете практически никакой информации или существующего кода для извлечения изображений из старого формата .xls.
Поначалу это показалось странным. Но если подумать, любой, кто когда-либо реализовывал парсер для такого формата, как ELF или ext2, знает, что следование опубликованной спецификации для создания парсера не является невозможным по своей сути – просто никто, по-видимому, не делал этого для этой конкретной нишевой задачи.
Поскольку его не было, я построил его
Я просмотрел официальную документацию Microsoft и в конечном итоге реализовал библиотеку C, которая может извлекать все встроенные изображения из устаревших файлов .xls. Он также совместим с C++. Все это состоит из трех файлов (один заголовок, два исходных файла), около 700+ строк кода, без каких-либо особых зависимостей, спроектированных так, чтобы быть легкими.
Я разместил его на GitHub для всех, кому интересно:
Код: Выделить всё
https://github.com/capp-adocia/xls2imgПочему ее еще не было?
Мое личное предположение состоит в том, что варианты использования C/C++ редко пересекаются с обработкой форматов офисных документов, таких как Excel. В этой области обычно доминируют такие языки, как Java, C# и Python. Итак, у Java есть POI, у C# есть NPOI, у Python есть различные библиотеки, но в экосистеме C их так и не было.
Мне любопытно услышать мысли сообщества:
- Я где-то пропустил существующую библиотеку C?
- Неужели необходимость извлекать изображения из файлов .xls просто слишком нишевая?
- Или большинство отпугивает сложность формата BIFF люди не пытаются это сделать?
Подробнее здесь: https://stackoverflow.com/questions/798 ... mages-from
Мобильная версия