Exemplo n.º 1
0
        /*
         * Zbindowane pod przycisk, konwertujemy bitmape z formatu wejsciowego na nasz który będziemy mogli przerobic
         */
        public Bitmap ApplyFilter(Bitmap bitmap)
        {
            uint *input  = null;
            uint *output = null;

            try
            {
                // Konwertujemy bitmapę do formatu 32-bitowego (argb)
                Bitmap bitmapInArgb = BitmapUtils.BitmapToArgb32(bitmap);

                int width  = bitmapInArgb.Width;
                int height = bitmapInArgb.Height;
                //Pole bitmapy
                int size = width * height;

                Rectangle  imageRectangle = new Rectangle(0, 0, width, height);
                BitmapData bitmapData     = bitmapInArgb.LockBits(imageRectangle, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
                //int zawiera 4 byte, 1 byte 8 bitów
                int byteSize = Marshal.SizeOf(typeof(uint)) * size;

                // Alokujemy niezarządzaną tablicę dla danych wejściowych/wyjściowych, rzutując obiekt na wsk unisigned int ustawiając wskaźnik na naszą zmienna input
                input  = (uint *)Marshal.AllocHGlobal(byteSize).ToPointer();
                output = (uint *)Marshal.AllocHGlobal(byteSize).ToPointer();
                void *bitmapPtr = bitmapData.Scan0.ToPointer();
                //kopiuje pamieć do input z bitmapPtr
                CopyMemory(input, bitmapPtr, (ulong)byteSize);

                bitmapInArgb.UnlockBits(bitmapData);

                // Resetujemy stoper i go startujemy
                _stopWatch.Reset();
                //sprawdzamy ile czas oricedura ProcessImage zajmie czasu
                _stopWatch.Start();

                // Właściwe przetwarzanie:
                uint *result = ProcessImage(input, output,
                                            (uint)width, (uint)height, Sigma, Boxes);

                _stopWatch.Stop();
                // zapisanie nowej bitmapy i zwolnienie pamieci

                Bitmap     bitmapResult = new Bitmap(width, height, PixelFormat.Format32bppArgb);
                BitmapData resultData   = bitmapResult.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
                //kopiowanie pamieci
                CopyMemory(resultData.Scan0.ToPointer(), result, (uint)(resultData.Stride * resultData.Height));
                bitmapResult.UnlockBits(resultData);

                return(bitmapResult);
            } finally
            {
                //zwolnienie pamięci
                Marshal.FreeHGlobal(new IntPtr(input));
                Marshal.FreeHGlobal(new IntPtr(output));
            }
        }