Plus vite le contraste de l'algorithme pour une image bitmap

J'ai un outil de trackbar contrôles de curseur utilisé pour ajuster automatiquement la luminosité de l'image, contraste, gamma, etc.

J'essaie d'obtenir en temps réel des mises à jour de mon image, tandis que l'utilisateur fait glisser le curseur. La luminosité et le gamma algorithmes sont une vitesse acceptable (autour de 170 ms). Mais le contraste de l'algorithme est d'environ 380ms.

Fondamentalement, mon formulaire est un outil de la fenêtre à l'aide des curseurs. Chaque fois que l'image est mise à jour, il envoie un événement pour le parent qui retrace la nouvelle image. La fenêtre de l'outil conserve l'image originale non modifiée verrouillé en mémoire donc j'ai toujours accès aux octets d'elle. Donc, fondamentalement, je le fais à chaque fois que l'événement ValueChanged pour un curseur (tels que le curseur de Contraste) est modifié.

  • LockBits de travail (destination) bitmap comme Format24bppRgb (bitmap d'origine dans Format32bppPArgb)
  • Maréchal.Copier les bits d'un octet tableau []
  • Vérifier l'opération pour laquelle je suis en train de faire (curseur qui a été choisi)
  • Utiliser le code suivant pour le Contraste:

Code:

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

J'ai lu une fois sur l'utilisation d'entiers à la place des valeurs à virgule flottante à une augmentation de la vitesse de contraste, mais je ne pouvais pas trouver que l'article de nouveau.

J'ai essayé d'utiliser le code unsafe (pointeurs) mais effectivement remarqué une diminution de la vitesse. Je suppose que c'était parce que le code est à l'aide de boucles for imbriquées pour itérer x et y, au lieu d'une seule boucle.

  • double possible de Ajuster le contraste d'une image en C# efficacement
  • Le code unsafe dans la question liée à la, quand je l'ai tester avec la même image que j'utilisais avec mon code, prend le relais de 900ms par la routine. Bien sûr, je l'ai modifié de sorte qu'il n'est pas de cloner ou créer de nouvelles images bitmaps, c'est juste la boucle imbriquée avec des pointeurs et des mathématiques à virgule flottante. Il est trop lent.
  • Peut-être que vous pouvez modifier votre code pour utiliser des pointeurs plutôt que dans le code unsafe.