ビットマップ イメージをフィルタリングして、色相、彩度、および明度の値を増減させようとしています。
私のコードは完全に機能していますが、遅いです。
元のソースと現在の宛先の 2 つのビットマップをメモリにロックしています。ユーザーは、さまざまなトラックバーコントロールを移動して、HSL 値に変換される各値を変更できます。たとえば、トラックバーの値は -1.0 ~ 1.0 の範囲に対応します。
トラックバーの値が変更されたというイベントがスローされるたびに、宛先ビットマップをロックし、HSL 値をソース ビットマップに適用して、結果を宛先ビットマップに格納する関数を実行します。完了したら、宛先ビットマップのロックを解除し、画面にイメージをペイントします。
以前は、バイトごとの操作を行っていたため、他のフィルターにルックアップ テーブルを使用していました。ただし、代わりに HSL を使用してそれを適用する方法がわかりません。私が使用しているコードは次のとおりです。
byte red, green, blue;
for (int i = 0; i < sourceBytes.Length; i += 3)
{
blue = sourceBytes[i];
green = sourceBytes[i + 1];
red = sourceBytes[i + 2];
Color newColor = Color.FromArgb(red, green, blue);
if (ModifyHue)
newColor = HSL.ModifyHue(newColor, Hue);
if (ModifySaturation)
newColor = HSL.ModifySaturation(newColor, Saturation);
if (ModifyLightness)
newColor = HSL.ModifyBrightness(newColor, Lightness);
destBytes[i] = newColor.B;
destBytes[i + 1] = newColor.G;
destBytes[i + 2] = newColor.R;
}
そして、ここに私のModifyBrightness関数があります:
public static Color ModifyBrightness(Color color, double brightness)
{
HSL hsl = FromRGB(color);
hsl.L *= brightness;
return hsl.ToRGB();
}
したがって、基本的に明るさスライダーが真ん中にある場合、その値は 0 になり、関数に渡すときに「1.0」に変換されるため、明るさが 1.0 倍されます。つまり、変化しません。スライダーを右端までドラッグすると、値が 100 になり、モディファイアが 2.0 になるので、明るさの値を 2.0 倍して 2 倍にします。