public static byte HardLight(byte value1, byte value2)
 {
     return(Calculations.ClampToByte(value1 <= 127 ?
                                     (value1 * value2) / 127.5f :
                                     255f - ((255 - value1) * (255 - value2)) / 127.5f
                                     ));
 }
        public static byte ColorBurn(byte value1, byte value2)
        {
            if (value1 == 0)
            {
                return(0);
            }

            return(Calculations.ClampToByte(255 - (65025 - 255 * value2) / value1));
        }
        public static byte SoftLight(byte value1, byte value2)
        {
            float floatValue1 = value1 / 255f;
            float floatValue2 = value2 / 255f;

            return(Calculations.ClampToByte(floatValue1 <= 0.5 ?
                                            255 * ((2f * floatValue1 - 1f) * (floatValue2 - floatValue2 * floatValue2) + floatValue2) :
                                            255 * ((2f * floatValue1 - 1f) * (Math.Sqrt(floatValue2) - floatValue2) + floatValue2)));
        }
        public static byte ColorDodge(byte value1, byte value2)
        {
            if (value1 == 255)
            {
                return(255);
            }

            return(Calculations.ClampToByte((255 * value2) / (255 - value1)));
        }
예제 #5
0
        public void HardLight(MyImage myImage2, TransitionModes transitionMode = TransitionModes.NoTransition, float previousPercentage = 0f, float percentage = 1f)
        {
            if (IsBlendingCalculated)
            {
                return;
            }

            percentage         = Calculations.ClampToNormal(percentage);
            previousPercentage = Calculations.ClampToNormal(previousPercentage);

            InitBoundaries(previousPercentage, percentage,
                           out float previousLinearBoundaryX, out float linearBoundaryX, out float previousReversedLinearBoundaryX, out float reversedLinearBoundaryX,
                           out float previousLinearBoundaryY, out float linearBoundaryY, out float previousReversedLinearBoundaryY, out float reversedLinearBoundaryY,
                           out float previousRightHalfLinearBoundaryX, out float rightHalfLinearBoundaryX, out float previousLeftHalfLinearBoundaryX, out float leftHalfLinearBoundaryX,
                           out float previousLowerHalfLinearBoundaryY, out float lowerHalfLinearBoundaryY, out float previousHigherHalfLinearBoundaryY, out float higherHalfLinearBoundaryY,
                           out float previusRadiusBoundary, out float radiusBoundary);

            int[] nums = Enumerable.Range(0, ByteArray.PrimitiveArray.Length / Channels).Select(i => i * Channels).ToArray();
            Parallel.ForEach(nums, i =>
            {
                Point coordinates = ByteArray.GetCoordinates(i);

                bool isValid = ValidateBoundaries(coordinates, transitionMode,
                                                  previousLinearBoundaryX, linearBoundaryX, previousReversedLinearBoundaryX, reversedLinearBoundaryX,
                                                  previousLinearBoundaryY, linearBoundaryY, previousReversedLinearBoundaryY, reversedLinearBoundaryY,
                                                  previousLeftHalfLinearBoundaryX, leftHalfLinearBoundaryX, previousRightHalfLinearBoundaryX, rightHalfLinearBoundaryX,
                                                  previousHigherHalfLinearBoundaryY, higherHalfLinearBoundaryY, previousLowerHalfLinearBoundaryY, lowerHalfLinearBoundaryY,
                                                  previusRadiusBoundary, radiusBoundary);

                if (!isValid)
                {
                    return;
                }
                ;

                for (int channel = 0; channel < Channels; channel++)
                {
                    ByteArray.PrimitiveArray[i + channel] = Calculations.ClampToByte(Blending.HardLight(ByteArray.PrimitiveArray[i + channel], myImage2.ByteArray.PrimitiveArray[i + channel]));
                }
            });

            WriteableBitmap writeableBitmap = new WriteableBitmap(BitmapSource.Create(Width, Height, 96, 96, PixelFormats.Bgr32, null, ByteArray.PrimitiveArray, ByteArray.Stride));

            WriteableBitmap = writeableBitmap;
        }
 public static byte Screen(byte value1, byte value2)
 {
     return(Calculations.ClampToByte(255 - ((255 - value1) * (255 - value2)) / 255));
 }
 public static byte Multiply(byte value1, byte value2)
 {
     return(Calculations.ClampToByte((value1 * value2) / 255));
 }
 public static byte Difference(byte value1, byte value2)
 {
     return(Calculations.ClampToByte(Math.Abs(value1 - value2)));
 }
 public static byte Overlay(byte value1, byte value2)
 {
     return(Calculations.ClampToByte(value2 <= 127 ?
                                     (value1 * value2) / 127.5f :
                                     255 - ((255 - value1) * (255 - value2)) / 127.5f));
 }
 public static byte LinearDodge(byte value1, byte value2)
 {
     return(Calculations.ClampToByte(value1 + value2));
 }
 public static byte Opacity(byte value1, byte value2, float opacity)
 {
     return(Calculations.ClampToByte(opacity * value1 + (1f - opacity) * value2));
 }
 public static byte LinearBurn(byte value1, byte value2)
 {
     return(Calculations.ClampToByte(value1 + value2 - 255));
 }