ho uno strumento con controlli a cursore trackbar utilizzati per regolare di un'immagine di luminosità, contrasto, gamma, eccalgoritmo di contrasto più veloce per una bitmap
Sto cercando di ottenere aggiornamenti in tempo reale per la mia immagine mentre l'utente trascina il cursore. Gli algoritmi di luminosità e gamma sono una velocità accettabile (circa 170 ms). Ma l'algoritmo di contrasto è di circa 380 ms.
Fondamentalmente il mio modulo è una finestra degli strumenti con cursori. Ogni volta che l'immagine viene aggiornata, invia un evento al genitore che ridisegna la nuova immagine. La finestra degli strumenti mantiene l'immagine originale non modificata bloccata in memoria, quindi ho sempre accesso ai suoi byte. In pratica, lo faccio ogni volta che viene modificato l'evento ValueChanged per un cursore (come il cursore Contrast).
- LockBits della bitmap di lavoro (destinazione) come Format24bppRgb (bitmap originale è in Format32bppPArgb)
- Marshal.Copy i bit a un byte [] array
- Controllare che il funzionamento che sto facendo (che slitta è stato scelto)
- utilizzare il seguente codice per il Contrasto:
codice:
double newValue = 0;
double c = (100.0 + contrast)/100.0;
c *= c;
for (int i = 0; i < sourcePixels.Length; i++)
{
newValue = sourcePixels[i];
newValue /= 255.0;
newValue -= 0.5;
newValue *= c;
newValue += 0.5;
newValue *= 255;
if (newValue < 0)
newValue = 0;
if (newValue > 255)
newValue = 255;
destPixels[i] = (byte)newValue;
}
Ho letto una volta sull'utilizzo di numeri interi anziché di valori in virgola mobile per aumentare la velocità di contrasto, ma non sono riuscito a trovare di nuovo l'articolo.
Ho provato a utilizzare codice non sicuro (puntatori) ma in realtà ho notato una diminuzione della velocità. Presumo che fosse perché il codice stava usando nested per loops per iterare xey invece di un singolo loop.
possibile duplicato di [Regola il contrasto di un'immagine in C# in modo efficiente] (http://stackoverflow.com/questions/3115076/aggiudi-il-contrasto-di-animage-in-c-sharp-efficientemente) – Magnus
Il codice non sicuro nella domanda a cui ti sei collegato, quando lo testo con la stessa immagine che stavo usando con il mio codice, richiede oltre 900ms per routine. Ovviamente l'ho modificato in modo che non clonasse o crei nuove bitmap, è solo il ciclo annidato con puntatori e matematica a virgola mobile. È troppo lento –
Forse è possibile modificare il codice per utilizzare i puntatori invece nel codice non sicuro. – Magnus