static void Main(string[] args)
        {
            DataVariables dv = new DataVariables();

            Bitmap source;
            //Bitmap output = new Bitmap(source.Width, source.Height);
            Bitmap hologram = new Bitmap(300, 300);
            //Bitmap hologram = new Bitmap(source.Width, source.Height);

            do
            {
                source = new Bitmap(dv.sourceFile, true);

                hologram = WriteHologram.Write(source, hologram, dv);

                //hologram = TruncHalf.Cut(hologram);

                hologram.Save(@"C:\Users\1\Desktop\hologram.bmp");

                //hologram = new Bitmap(@"C:\Users\1\Desktop\hologram.bmp",true);
                //output = ReadHologram.Read(hologram, output, dv);
                //output.Save(@"C:\Users\1\Desktop\output.bmp");

                source.Dispose();

            } while (Console.ReadKey().ToString() != "q");
        }
        public static Bitmap Read(Bitmap bmpHologram, Bitmap bmpOutput, DataVariables dv)
        {
            double d; //расстояние между точками считаемыми точками
            double cph; //косинус фазы волны
            double intensity; //интенсивность света
            double r, g, b; // цвета
            int xO, xH, yO, yH;
            Bitmap bmpNew = new Bitmap(bmpOutput.Width, bmpOutput.Height, PixelFormat.Format24bppRgb);
            BitmapData bmpDataHologram = bmpHologram.LockBits(new Rectangle(0, 0, bmpHologram.Width, bmpHologram.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            BitmapData bmpDataOutput = bmpNew.LockBits(new Rectangle(0, 0, bmpNew.Width, bmpNew.Height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

            int hWidth = bmpDataHologram.Width;
            int hHeight = bmpDataHologram.Height;

            int oWidth = bmpDataOutput.Width;
            int oHeight = bmpDataOutput.Height;

            IntPtr oldFPx = bmpDataHologram.Scan0;
            IntPtr newFPx = bmpDataOutput.Scan0;

            unsafe
            {

                byte* oldBPtr = (byte*)oldFPx.ToPointer();
                byte* newBPtr = (byte*)newFPx.ToPointer();

                byte* oldBPtrHelper = oldBPtr;
                byte* newBPtrHelper = newBPtr;

                for (xO = 0; xO < oWidth; xO++)
                {
                    Console.WriteLine(xO);
                    for (yO = 0; yO < oHeight; yO++)
                    {
                        r = 0;
                        g = 0;
                        b = 0;

                        oldFPx = bmpDataHologram.Scan0;
                        oldBPtr = (byte*)oldFPx.ToPointer();
                        oldBPtrHelper = oldBPtr;

                        for (xH = 0; xH < hWidth; xH++)
                        {
                            for (yH = 0; yH < hHeight; yH++)
                            {
                                byte rS = *(oldBPtr++);
                                byte gS = *(oldBPtr++);
                                byte bS = *(oldBPtr++);

                                d = Math.Sqrt((xH - xO + dv.p) * (xH - xO + dv.p) + (yH - yO + dv.p) * (yH - yO + dv.p) + dv.z * dv.z);
                                cph = Math.Cos(d / dv.w);
                                intensity = 1 / (d * d);
                                //intensity = 1;
                                r += rS * cph * intensity * dv.sensitivityOutput;
                                g += gS * cph * intensity * dv.sensitivityOutput;
                                b += bS * cph * intensity * dv.sensitivityOutput;

                            }
                            oldBPtrHelper += bmpDataHologram.Stride;
                            oldBPtr = oldBPtrHelper;
                        }

                        r = (Math.Abs(Math.Truncate(r)) < 255) ? Math.Abs(Math.Truncate(r)) : 255;
                        g = (Math.Abs(Math.Truncate(g)) < 255) ? Math.Abs(Math.Truncate(g)) : 255;
                        b = (Math.Abs(Math.Truncate(b)) < 255) ? Math.Abs(Math.Truncate(b)) : 255;

                        *(newBPtr++) = (byte)r;
                        *(newBPtr++) = (byte)g;
                        *(newBPtr++) = (byte)b;

                    }
                    newBPtrHelper += bmpDataOutput.Stride;
                    newBPtr = newBPtrHelper;
                }
            }

            bmpNew.UnlockBits(bmpDataOutput);
            bmpHologram.UnlockBits(bmpDataHologram);
            return bmpNew;
        }