Имея буфер изображения в памяти, какой самый быстрый способ создать его миниатюру? - PullRequest
7 голосов
/ 22 августа 2009

Попытка создать приложение для получения изображений, оптимизированное для быстрого сканера (которое может обеспечить до 6 сжатых изображений [цветной + серый + двоичный] [передний + задний] для каждой бумаги со скоростью 150 стр / мин) I есть некоторые проблемы со скоростью. Используя технологию TWAIN и режим передачи в буфер памяти (TWSX_MEMORY), я получаю буфер изображения (как файл JPEG или TIFF, загруженный в память) со сканера и сохраняю его в папке назначения моего приложения. Если я не хочу создавать миниатюры, мое приложение не вызывает потери скорости для сканера, но если я хочу, благодаря тому, как я это делаю (сохранение буфера в файл в моей C ++ TWAIN-обработке dll, уведомление моего хост-приложения .NET с указанием пути к целевому файлу с использованием указателя на функцию, открытием файла изображения в C # и созданием миниатюрного изображения) мое приложение вызывает резкое снижение скорости сканирования. Я попробовал некоторые оптимизации, такие как выполнение фазы загрузки в отдельном потоке и отправка буфера файлов неуправляемых изображений на хост .NET и попытка загрузить его в небезопасном контексте (UnmanagedMemoryStream) и создание эскиза. Но это не улучшило скорость значительно. Итак, мой вопрос:

Имея в памяти буфер файла изображения (например, сжатый 24-битный JPEG без миниатюры с вложением), существует ли быстрый прямой способ создания из него миниатюрного изображения? Что вы предлагаете как самый быстрый способ создания миниатюр в этом случае?

Ответы [ 2 ]

7 голосов
/ 22 августа 2009

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

Если вы можете найти источники для него, взгляните на EPEG из проекта Просвещения. Он делает именно то, что вы ищете с файлами JPEG, полностью без декодирования или распаковки изображения. Исходный код будет очень поучительным.

Для других форматов изображений это не так просто - вам нужно будет декодировать и визуализировать изображение в буфер памяти, а затем выполнить собственное масштабирование. В этом могут помочь библиотеки CImg и boost :: GIL.

3 голосов
/ 22 августа 2009

Я так понимаю, проблема в том, что преобразование изображения в миниатюру занимает больше времени, чем получение изображения в первую очередь, правильно?

Хотя более быстрая программа преобразования миниатюр может решить эту проблему для вас, этого может быть недостаточно для кого-то с более медленным компьютером. Вместо этого я предлагаю создать очередь изображений для преобразования в миниатюры - то есть у вас есть один поток (или процесс), который добавляет отсканированные изображения в очередь, и другой поток / процесс, который удаляет изображения из этой очереди и создает миниатюры из них. Таким образом, относительные скорости двух операций не имеют значения.

...