private static void WriteToFile(int[][] matrixY, int[][] matrixCb, int[][] matrixCr, int size)
        {
            var filename = "wavelet.wvlt";

            using (var writer = new BinaryWriter(File.Open(string.Format(filename), FileMode.Create)))
            {
                for (var i = 0; i < size; i++)
                {
                    for (var j = 0; j < size; j++)
                    {
                        writer.Write(matrixY[i][j]);
                        writer.Write(matrixCb[i][j]);
                        writer.Write(matrixCr[i][j]);
                    }
                }
                writer.Write(size);
            }
            JpegHelper.Zip7(filename);
        }
        public static BitmapSource WaveletStep(Image image, int size, double threshold)
        {
            var source = ((BitmapSource)image.Source);
//            var ycbcr = MainWindow.ToYCbCr(source);
            var ycbcr = source.ToPixels();

            var compY  = new byte[size * size];
            var compCb = new byte[size * size];
            var compCr = new byte[size * size];

            for (var i = 0; i < size * size * 4; i += 4)
            {
                compY[i / 4]  = ycbcr[i];
                compCb[i / 4] = ycbcr[i + 1];
                compCr[i / 4] = ycbcr[i + 2];
            }
            var matrixY  = JpegHelper.ToMatrix(compY.Select(x => (int)x).ToArray(), size);
            var matrixCb = JpegHelper.ToMatrix(compCb.Select(x => (int)x).ToArray(), size);
            var matrixCr = JpegHelper.ToMatrix(compCr.Select(x => (int)x).ToArray(), size);

            var d4        = GetDaubechiesMatrix(size);
            var inverseD4 = d4.GetTranspose(size);

            var transformedY  = DaubechiesTransformation(matrixY, d4, size, threshold);
            var transformedCb = DaubechiesTransformation(matrixCb, d4, size, threshold);
            var transformedCr = DaubechiesTransformation(matrixCr, d4, size, threshold);

            //перемешать, записать в файл, сжать
//            var bytesCount = transformedY.Length * transformedY + transformedCr.Length + transformedCb.Length;

            var zerosCount = CountZeros(transformedY, size) + CountZeros(transformedCr, size) +
                             CountZeros(transformedCb, size);
            var totalCount = transformedY.Length * transformedY[0].Length * 3;

            MessageBox.Show(string.Format("Zeros count = {0}{1} Total = {2}{1} Zeros percent = {3}", zerosCount, Environment.NewLine, totalCount, zerosCount * 100.0 / totalCount));

            var changedY  = ChangeOrder(transformedY, size);
            var changedCb = ChangeOrder(transformedCb, size);
            var changedCr = ChangeOrder(transformedCr, size);

            WriteToFile(changedY, changedCb, changedCr, size);

            //back
            var backY  = DaubechiesTransformation(transformedY, inverseD4, size, threshold, true);
            var backCb = DaubechiesTransformation(transformedCb, inverseD4, size, threshold, true);
            var backCr = DaubechiesTransformation(transformedCr, inverseD4, size, threshold, true);

            compY  = JpegHelper.MatrixToPixels(backY, size).Select(x => MainWindow.GetByteValue(x)).ToArray();
            compCb = JpegHelper.MatrixToPixels(backCb, size).Select(x => MainWindow.GetByteValue(x)).ToArray();
            compCr = JpegHelper.MatrixToPixels(backCr, size).Select(x => MainWindow.GetByteValue(x)).ToArray();

            var pixels = new byte[size * size * 4];

            for (var i = 0; i < size * size * 4; i += 4)
            {
                pixels[i]     = compY[i / 4];
                pixels[i + 1] = compCb[i / 4];
                pixels[i + 2] = compCr[i / 4];
            }

            return(BitmapSource.Create(size, size, source.DpiX, source.DpiY, source.Format, null, pixels, source.PixelWidth * 4));
        }