색조, 채도 및 밝기 값을 높이거나 낮추기 위해 비트 맵 이미지를 필터링하려고합니다.비트 맵에서 색조/채도/밝기를 변경하는 더 빠른 알고리즘
내 코드는 완벽하게 작동하지만 은 느림입니다.
원본 소스와 현재 대상의 두 비트 맵을 메모리에 잠급니다. 사용자는 다양한 트랙 바 컨트롤을 이동하여 각 값을 수정 한 다음 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 기능입니다 : 자신의 밝기 슬라이더가 매우 중간에있는 경우, 그 값은 내가로 변환됩니다 0입니다 그래서 기본적으로
public static Color ModifyBrightness(Color color, double brightness)
{
HSL hsl = FromRGB(color);
hsl.L *= brightness;
return hsl.ToRGB();
}
"1.0"을 함수에 전달하면 밝기에 1.0이 곱해 지므로 변경되지 않습니다. 슬라이더를 오른쪽으로 드래그하면 값이 100이되어 2.0의 수식자가됩니다. 따라서 밝기 값에 2.0을 곱하여 곱합니다.
우선 캐시 결과, 그리고 빨리 배열에 액세스하기위한 안전하지 않은 코드를 사용합니다. – SimpleVar
+1. 그런 마이크로 코드를 사용하면 어레이 액세스가 완전히 당신을 죽입니다. 모든 액세스는 최소값/최대 값에 대한 검사입니다. 안전하지 않은 포인터 코드를주세요. 동시에 모든 값을 가진 바이트에서 struct로 이동하십시오. – TomTom
혹시이 문서화 된 참고 자료가 있습니까? Afaik 배열 구문은 배열이 포인터 일 때 포인터 구문과 동일합니까? 어쨌든 최대/최소 한계는 없습니다. – Rotem