GDI+ Потрясающая скорость декодирования и ужасная скорость прорисовки!

StackOverflow https://stackoverflow.com/questions/271428

  •  06-07-2019
  •  | 
  •  

Вопрос


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

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

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

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);

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

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

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);

В методе на пенде код все еще немного медленно ~~~

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

быстрее, чем

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

Правильный?

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top