2008-11-07 9 views
1

Merci pour les réponses, En fait, je ne suis pas perplexe dessiner 1024 * 768 pixels est plus lent que 100 * 100 pixels ... Il est une logique si simple .. Ce qui me fait perplexe est que l'algorithme d'interpolation de DrawImage peut être très lent, alors qu'il existe beaucoup de meilleur algorithme, et son décodeur semble pouvoir décoder à partir d'un jpg avec une certaine résolution, c'est vraiment cool, je recherche parfois mais je ne trouve pas de lib pour le faire ...La vitesse de décodage incroyable de GDI +, et la vitesse de tirage terrible!

C'est vraiment étrange! J'ajoute le code suivant dans la méthode Paint. c: \ 1.jpg est 5M fichier jpg, environ 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); 

Ce qui précède est vraiment rapide! même en temps réel! Je ne pense pas que décoder un JPG 5m peut être aussi rapide!

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

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

Le code ci-dessus devient vraiment lent

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

Si j'ajoute Bitmap = Bitmap :: FromFile (L "c: \ 1.jpg", true); // en construction

laisser

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

dans la méthode OnPaint, Le code est encore un peu lent ~~~

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

comparaison avec le décodage, le processus drawImage est vraiment lent ...

Pourquoi et comment ont-ils fait? Est-ce que Microsoft a payé les hommes prenant en charge le double salaire du décodeur que les hommes prenant en charge l'écriture de dessinImage?

Répondre

2

Vous n'avez pas besoin de décoder les JPG si vous réduisez d'un facteur 8. Les images JPG sont constituées de blocs de 8 par 8 pixels, transformés en DCT. La valeur moyenne de ce bloc est le coefficient 0,0 de la DCT. Donc, réduire d'un facteur 8 revient simplement à jeter tous les autres composants. Réduire la taille encore plus loin (par exemple 4000 -> 200) est juste une question de réduire de 4000 à 500, puis de redimensionner normalement de 500 à 200 pixels.

+0

Merci! Ça aide! – user25749

+0

Y a-t-il une bibliothèque pratique pour faire cela? – user25749

+0

La mise en œuvre de l'IJG est plutôt bonne, en fait. – MSalters

5

Alors, ce que vous êtes vraiment se demander pourquoi

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

est plus rapide que

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

correcte? Eh bien, le fait que vous dessinez 100 fois plus de pixels dans le second cas pourrait avoir quelque chose à voir avec cela.

+0

Je ne suis pas un casse-tête sur le dessin 40000 pixels est plus rapide que 4000000pixles. et que le dessin image-> largeur * image-> hauteur est plus rapide que l'image-> largeur/2 * image-> hauteur/2 aussi ne me laisse pas perplexe, à cause du calcul d'interpolation. Quoi que, merci pour votre réponse – user25749

2

Il est possible que le décodage soit différé jusqu'à ce que nécessaire. C'est pourquoi c'est si rapide. Peut-être sur le boîtier 200x200 GDI + décode seulement assez de blocs pour peindre 200x200 et sur 2000x2000 ils décode plus.

Les routines graphiques contiennent toujours des optimisations obscures que vous ne pourriez jamais connaître.

Peut-être que Reflector vous le dira?

0

Juste une supposition, mais pourriez-vous essayer de dessiner avec 4000x3000 ou 2000x1500? Peut-être que le fait que 4000 et 3000 soient divisibles par 200 accélère le tout et que 3000 ne soit pas divisible par 200 le ralentisse (bien que cela soit vraiment bizarre).

Généralement, effectuez un profilage ou une mesure de temps. Si 2000x2000 est environ 100 fois plus lent que 200x200, tout va bien. Et ne vous embêtez pas si 2000x2000 est trop lent. Si votre écran est à 1024x768, vous ne pouvez pas voir toute l'image, alors mieux vaut choisir la partie de l'image qui est visible à l'écran et la dessiner, 1024x768 est 5 fois plus rapide que 2000x2000.

Questions connexes