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