2008-11-07 5 views
1

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

Это действительно странно! Я добавлю следующий код в метод Paint. c: \ 1.jpg - файл 5M jpg, около 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); 

в методе OnPaint, код еще немного медленно ~~~

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

Сравнения с декодированием DrawImage процесс очень медленно ...

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

ответ

2

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

+0

Спасибо! Это помогает! – user25749 2008-11-08 01:06:22

5

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

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

быстрее, чем

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

Правильно?

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

+0

Я не головоломка о чертеже 40000 пикселей быстрее, чем 4000000pixles. и что рисование height-> width * image-> height быстрее, чем image-> width/2 * image-> hight/2 также не озадачило меня из-за расчета Интерполяции. Независимо от того, спасибо за ваш ответ – user25749 2008-11-08 01:09:49

2

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

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

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

Возможно, Reflector скажет вам?

0

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

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