La straordinaria velocità di decodifica di GDI + e la terribile velocità di disegno!

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

  •  06-07-2019
  •  | 
  •  

Domanda


Grazie per le risposte & # 65292; In realtà non sono perplesso sul disegnare 1024 * 768 pixel è più lento di 100 * 100 pixel ... È una logica così semplice ... Il che mi ha reso perplesso è che l'algoritmo di interpolazione di DrawImage potrebbe essere molto lento, mentre esiste un algoritmo migliore e il suo decodificatore può decodificare da un jpg con una certa risoluzione, è davvero bello, cerco qualche volta ma non ne trovo lib gratuita per fare questo ...

È davvero strano! Aggiungo il seguente codice nel metodo Paint. c: \ 1.jpg è un file jpg 5M, circa 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);

Quanto sopra è davvero veloce! anche in tempo reale! Non credo che decodificare un JPG da 5m possa essere così veloce!

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

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

Il codice sopra diventa molto lento

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

Se aggiungo Bitmap = Bitmap :: FromFile (L " c: \ 1.jpg " ;, true); // in costruzione

lascia

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

nel metodo OnPaint, Il codice è ancora un po 'lento ~~~

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

Rispetto alla decodifica, il processo drawImage è molto lento ...

Perché e come hanno fatto? Microsoft ha pagato gli uomini che si occupavano del doppio stipendio del decodificatore rispetto agli uomini che si occupavano di scrivere il disegno Immagine?

È stato utile?

Soluzione

Non è necessario decodificare i JPG se si ridimensiona di un fattore 8. Le immagini JPG sono costituite da blocchi di 8 per 8 pixel, trasformati DCT. Il valore medio di questo blocco è il coefficiente 0,0 del DCT. Quindi, ridimensionare un fattore 8 è semplicemente una questione di buttare via tutti gli altri componenti. Ridimensionare ulteriormente (ad esempio 4000- > 200) è solo una questione di ridimensionamento da 4000 a 500, e quindi ridimensionamento normalmente da 500 a 200 pixel.

Altri suggerimenti

Quindi, quello che ti stai davvero chiedendo è perché

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

è più veloce di

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

Una corretta?

Bene, il fatto che stai disegnando 100 volte più pixel nel secondo caso potrebbe avere qualcosa a che fare con esso.

Potrebbe essere possibile che la decodifica venga differita fino a quando non sarà necessario. Ecco perché è così veloce.

Forse sul caso 200x200 GDI + decodifica solo blocchi sufficienti per dipingere 200x200 e su 2000x2000 ne decodifica di più.

Le routine grafiche contengono sempre alcune oscure ottimizzazioni, che non potresti mai sapere.

Forse Reflector te lo dirà?

Solo un'ipotesi, ma potresti provare a disegnare con 4000x3000 o 2000x1500? Forse il fatto che 4000 e 3000 siano divisibili per 200 sta accelerando il tutto e 3000 non essere divisibile per 200 lo rallenta (anche se questo sarebbe davvero strano).

Generalmente, esegui una profilazione o misura del tempo. Se 2000x2000 è circa 100 volte più lento di 200x200, va tutto bene. E non preoccuparti se 2000x2000 è troppo lento. Se lo schermo è a 1024x768, non puoi vedere l'intera immagine, quindi è meglio scegliere la parte dell'immagine che è visibile sullo schermo e disegnarla, 1024x768 è 5 volte più veloce di 2000x2000.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top