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)); }