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.
Vous devez vous connecter pour publier un commentaire.
En fonction de la machine que vous utilisez cette fonction est activée, votre technique pourrait être assez lente. Si vous utilisez un système de BRAS sans FPU, chacune de ces opérations serait prendre un certain temps. Puisque vous êtes la même opération pour chaque octet, une technique plus rapide serait de créer un 256 entrées de la table de choix pour le niveau de contraste et de traduire chaque image octet à travers la table. Votre boucle, pourrait alors ressembler à ceci:
@BitBank répond à votre question, comme demandé, je voulais ajouter que si vous êtes après les performances, pensez à votre code qui est d'obtenir les données de pixel et la valeur par la suite.
Travail plein de code à l'aide de pointeurs (accessoires @BitBank sur le
for
code de boucle):Si vous êtes à la définition de votre image en pixels des données à l'aide
Marshal.Copy
vous trouverez cela fonctionne mieux.Cela devrait effectuer plus rapidement que votre code actuel, et vous également de réduire l'empreinte mémoire qui est bon lorsque vous traitez avec de très grandes images.