Удивительная скорость декодирования GDI + и ужасная скорость рисования! - PullRequest
1 голос
/ 07 ноября 2008

Спасибо за ответы , На самом деле я не озадачен рисованием 1024 * 768 пикселей медленнее, чем 100 * 100 пикселей ... Это такая простая логика .. Что меня озадачило, так это то, что алгоритм интерполяции DrawImage может быть очень медленным, хотя существует множество более качественных алгоритмов, и его декодер, кажется, может декодировать из JPG с определенным разрешением, это действительно круто, я ищу некоторое время, но не нахожу бесплатная библиотека для этого ...

Это действительно странно! Я добавляю следующий код в метод Paint. c: \ 1.jpg - 5M jpg файл, около 4000 *3000* 1004 *

// --------------------------------------------- -----------------

HDC hdc = pDC->GetSafeHdc();
bitmap = Bitmap::FromFile(L"c:\\1.jpg",true);
Graphics graphics(hdc);
graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
graphics.DrawImage(bitmap,0,0,200,200);

Выше очень быстро! даже в режиме реального времени! Я не думаю, что декодировать JPG 5 м может быть так быстро!

// --------------------------------------------- -----------------

HDC hdc = pDC->GetSafeHdc();
bitmap = Bitmap::FromFile(L"c:\\1.jpg",true);
Graphics graphics(hdc);
graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
graphics.DrawImage(bitmap,0,0,2000,2000);

Код выше стал очень медленным

// --------------------------------------------- -----------------

Если я добавлю Bitmap = Bitmap :: FromFile (L "c: \ 1.jpg", true); // в конструкцию

оставить

    Graphics graphics(hdc);
    graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
    graphics.DrawImage(bitmap,0,0,2000,2000);

в методе OnPaint, Код все еще немного медленный ~~~

// --------------------------------------------- ---------------------

По сравнению с декодированием процесс drawImage действительно медленный ...

Почему и Как они это сделали? Microsoft платила мужчинам, отвечающим за декодер, двойную зарплату, чем мужчинам, отвечающим за написание DrawingImage?

Ответы [ 4 ]

5 голосов
/ 07 ноября 2008

Итак, что вы действительно задаетесь вопросом, почему

graphics.DrawImage(bitmap,0,0,200,200);

быстрее

graphics.DrawImage(bitmap,0,0,2000,2000);

Правильно?

Ну, тот факт, что вы рисуете в 100 раз больше пикселей во втором случае, может иметь к этому какое-то отношение.

2 голосов
/ 07 ноября 2008

Вам не нужно декодировать файлы JPG, если вы уменьшаете их в 8 раз. Изображения JPG состоят из блоков размером 8 на 8 пикселей с преобразованием DCT. Среднее значение этого блока составляет 0,0 коэффициента DCT. Таким образом, уменьшение в 8 раз - это просто вопрос выбрасывания всех других компонентов. Уменьшение еще больше (например, 4000-> 200) - это всего лишь вопрос уменьшения масштаба с 4000 до 500, а затем обычного масштабирования от 500 до 200 пикселей.

2 голосов
/ 07 ноября 2008

Возможно, что декодирование отложено до необходимости. Вот почему это так быстро.

Возможно, в случае 200x200 GDI + декодирует только достаточно блоков для рисования 200x200, а в 2000x2000 - больше.

Графические процедуры всегда содержат некоторые неясные оптимизации, о которых вы никогда не знали.

Может быть Отражатель вам скажет?

0 голосов
/ 07 ноября 2008

Просто предположение, но не могли бы вы попробовать рисовать с 4000x3000 или 2000x1500? Возможно, тот факт, что 4000 и 3000 делятся на 200, ускоряет целое, а 3000 не делится на 200, замедляет его (хотя это действительно было бы странно).

Как правило, выполняйте профилирование или измерение времени. Если 2000x2000 примерно в 100 раз медленнее, чем 200x200, все в порядке. И не беспокойтесь, если 2000x2000 слишком медленный. Если ваш экран имеет разрешение 1024x768, вы не можете видеть все изображение целиком, поэтому лучше выбрать часть изображения, которая видна на экране, и нарисовать ее, 1024x768 в 5 раз быстрее, чем 2000x2000.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...