Мне нужно создать эскизы «огромных» файлов изображений без загрузки полного изображения в память. Эта функция отлично реализована в BitmapImage.DecodePixelWidth / Высота WPF, но мне нужно использовать ее в неуправляемой dll C++.
Я «думаю», что это реализовано с помощью WIC, однако я не могу найти какой-либо полезный пример этой функциональности, я бы загрузил все форматы эскизов, которые может обрабатывать WIC.
Кто-нибудь может помочь в этом?
Что будет делать ваша программа? Какой ввод, вывод вы ожидаете?
Я бы ввел имя файла изображения и вывел несжатое растровое изображение (массив пикселей в формате RGBA или RGB) нужного размера.
Два кодека WIC (JPEG и JPEG-XR) поддерживают масштабирование в декодере, и вы можете проверить это во время выполнения, используя IWICBitmapSourceTransform::GetClosestSize
. Однако, даже если исходное изображение необходимо декодировать с полным разрешением, IWICBitmapScaler
будет использовать минимальную память при масштабировании изображения до желаемого размера, как указано в документации замечания.
Более того, IWICBitmapScaler
будет автоматически использовать возможности IWICBitmapSourceTransform
декодера, если они поддерживаются, так что вы можете просто использовать его и автоматически получить желаемое поведение.
Спасибо! У вас есть фрагмент кода с правильными шагами, которые могли бы мне помочь?
Этот пример из документации имеет базовое использование: docs.microsoft.com/en-us/windows/desktop/wic/….
Просто примечание: Примечания в MS Docs говорит, что Кодеки JPEG и Portable Network Graphics (PNG) изначально декодируют изображение до указанного размера; другие кодеки декодируют изображение в исходном размере и масштабируют изображение до нужного размера.. Так что это может быть не «идеально» для всех форматов изображений.