StretchDIBits кажется медленным, Есть ли быстрее какой-либо API?

Ваша логика имела бы смысл, если бы возвращаемое значение main было интерпретировано как логическое значение, но это не так. Возврат из первоначального вызова к main подобен вызову функции exit: она сообщает о состоянии завершения системе, в которой вы работаете.

Стандарт C определяет 3 переносимых состояния выхода:

  • 0, указывающих на успех
  • EXIT_SUCCESS, также указывающих на успех
  • EXIT_FAILURE, указывающих fail

(последние два являются макросами, определенными в <stdlib.h>.)

В Unix допускается любое 8-битное значение (0 .. 255). Все ненулевые значения интерпретируются как коды ошибок. Не существует универсального соглашения о том, что означает любое число, просто то, что 0 представляет успех, а все остальное - своего рода провал.

Что касается того, кто может использовать возвращаемое значение: В Unix родительский процесс может использовать wait или waitpid, чтобы получить статус выхода прерванного потомка.


В стандартной библиотеке C функции, выполняющие действие, обычно не возвращают статус «истина / ложь». (Тесты, такие как islower или isdigit, но у них нет других эффектов.) Например, remove (который удаляет файл) возвращает 0 в случае успеха и -1 в случае ошибки. Это также общий шаблон с системными вызовами Unix. Например, open возвращает дескриптор файла (неотрицательное целое число) при успехе и -1 при ошибке.

5
задан Adrian McCarthy 18 October 2010 в 18:17
поделиться

1 ответ

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

Если вы просто рисуете изображение только один раз, тогда я думаю, что вам нужна функция SetDIBitsToDevice .

Если вам важна скорость, потому что вы рисуете один и тот же DIB несколько раз, то вы можете улучшите производительность, скопировав DIB в совместимый DC памяти один раз, а затем BitBlt -когда из DC памяти на экран (или принтер) каждый раз, когда вам это нужно. Используйте CreateCompatibleDC , чтобы создать DC памяти, а затем используйте StretchDIBits или SetDIBitsToDevice , чтобы получить на нем изображение. После этого вы можете напрямую использовать BitBlt .

8
ответ дан 14 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: