Je modifie les valeurs de couleur de chaque pixel d'une image en fonction d'un calcul. Le problème est que cela prend plus de 5 secondes sur ma machine avec une image 1000x1333 et je cherche un moyen de l'optimiser pour être beaucoup plus rapide.Comment utiliser les valeurs chromatiques calculées avec ColorMatrix?
Je pense que ColorMatrix
peut être une option, mais j'ai du mal à comprendre comment j'obtiendrais un ensemble de valeurs RVB de pixels, utilisez-le pour calculer et ensuite définir la nouvelle valeur de pixel. Je peux voir comment cela peut être fait si je modifiais (en multipliant, soustrayant, etc.) la valeur d'origine avec ColorMatrix, mais maintenant comment je peux utiliser la valeur retournée par les pixels pour l'utiliser et calculer une nouvelle valeur.
Par exemple:
Sub DarkenPicture()
Dim clrTestFolderPath = "C:\Users\Me\Desktop\ColorTest\"
Dim originalPicture = "original.jpg"
Dim Luminance As Single
Dim bitmapOriginal As Bitmap = Image.FromFile(clrTestFolderPath + originalPicture)
Dim Clr As Color
Dim newR As Byte
Dim newG As Byte
Dim newB As Byte
For x = 0 To bitmapOriginal.Width - 1
For y = 0 To bitmapOriginal.Height - 1
Clr = bitmapOriginal.GetPixel(x, y)
Luminance = ((0.21 * (Clr.R) + (0.72 * (Clr.G)) + (0.07 * (Clr.B))/ 255
newR = Clr.R * Luminance
newG = Clr.G * Luminance
newB = Clr.B * Luminance
bitmapOriginal.SetPixel(x, y, Color.FromArgb(newR, newG, newB))
Next
Next
bitmapOriginal.Save(clrTestFolderPath + "colorized.jpg", ImageFormat.Jpeg)
End Sub
La valeur Luminance
est celle calculée. Je sais que je peux mettre ColorMatrix
de M00, M11, M22 à 0, 0, 0 respectivement, puis mettre une nouvelle valeur dans M40, M41, M42, mais cette nouvelle valeur est calculée sur la base d'une multiplication de valeur et l'addition des composants de ce pixel (((0.21 * (Clr.R) + (0.72 * (Clr.G)) + (0.07 * (Clr.B))
et le résultat de cela - Luminance
- est multiplié par le composant de couleur).
Est-ce encore possible avec ColorMatrix
?
merci, je vais vérifier cela. J'utilise VB.NET, donc je comprends que le marshalling n'est pas aussi rapide en VB que le lock/unlockbits en C#. Je vais essayer de faire fonctionner cela. –
Vous pouvez ajouter un projet C# à votre solution VB.Net et ajouter simplement cette méthode critique unique à l'appel de votre code VB. Je suppose que vous obtiendriez quelque part une amélioration de la vitesse de 30 fois. –