2013-10-22 4 views

답변

0

커스텀 Aforge.net 필터를 작성하여이 문제를 해결할 수있었습니다. 필터는 HSL 색상 값을 사용하고 제공된 이미지에 색조를 적용합니다.

protected override unsafe void ProcessFilter(UnmanagedImage image, Rectangle rect) 
    { 
     int pixelSize = Bitmap.GetPixelFormatSize(image.PixelFormat)/8; 

     int startX = rect.Left; 
     int startY = rect.Top; 
     int stopX = startX + rect.Width; 
     int stopY = startY + rect.Height; 
     int offset = image.Stride - rect.Width*pixelSize; 

     var rgb = new RGB(); 
     var hsl = new HSL(); 

     // do the job 
     byte* ptr = (byte*) image.ImageData.ToPointer(); 

     // allign pointer to the first pixel to process 
     ptr += (startY*image.Stride + startX*pixelSize); 

     // for each row 
     for (int y = startY; y < stopY; y++) 
     { 
      // for each pixel 
      for (int x = startX; x < stopX; x++, ptr += pixelSize) 
      { 
       rgb.Red = ptr[RGB.R]; 
       rgb.Green = ptr[RGB.G]; 
       rgb.Blue = ptr[RGB.B]; 

       // convert to HSL 
       HSL.FromRGB(rgb, hsl); 

       // modify hsl values 
       hsl.Hue = hue; 
       hsl.Saturation = saturation; 
       hsl.Luminance = Math.Min(0.97f, hsl.Luminance * (120 * luminance/65)); 

       // convert back to RGB 
       HSL.ToRGB(hsl, rgb); 

       ptr[RGB.R] = (byte)rgb.Red; 
       ptr[RGB.G] = (byte)rgb.Green; 
       ptr[RGB.B] = (byte)rgb.Blue; 
      } 
      ptr += offset; 
     } 

    }