我想要過濾位圖圖像以增加或減少色調,飽和度和亮度值。更快的算法來改變位圖中的色相/飽和度/亮度
我的代碼工作正常,但是很慢。
我在內存中鎖定了兩個位圖,原始源和當前目標。用戶可以移動各種軌跡欄控件來修改每個值,然後將其轉換爲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來將其加倍。
我會做的第一件事是緩存結果,並使用不安全的代碼,用於訪問數組更快。 – SimpleVar
+1。像這樣的微碼,陣列訪問完全殺死你。每次訪問都會檢查最小/最大值。歡迎不安全的指針代碼。並且從字節移動到同時具有所有值的結構。 – TomTom
你們有沒有這方面的文件記錄?當數組是指針時,Afaik數組語法等於指針語法,否?反正沒有最小/最大限制。 – Rotem