private void LoadImage(WriteableBitmap bitmap) { if (bitmap.PixelWidth != 0 && bitmap.PixelHeight != 0) { this.loadedBitmap = bitmap; BlurGenTaskData task_data = new BlurGenTaskData(); task_data.radius = this.gaussianRadius; task_data.width = bitmap.PixelWidth; task_data.height = bitmap.PixelHeight; task_data.pixels = bitmap.Pixels; this.blurGeneratorWorker.RunWorkerAsync(task_data); this.GenerationProgressIndicator.IsVisible = true; } }
private void StartBlurGenerator() { if (this.scaledBitmap != null) { try { BlurGenTaskData task_data = new BlurGenTaskData(); task_data.radius = this.gaussianRadius; task_data.width = this.scaledBitmap.PixelWidth; task_data.height = this.scaledBitmap.PixelHeight; task_data.pixels = this.scaledBitmap.Pixels; this.blurGeneratorWorker.RunWorkerAsync(task_data); this.GenerationProgressIndicator.IsVisible = true; } catch (Exception) { // Ignore } } }
private void blurGeneratorWorker_DoWork(object sender, DoWorkEventArgs e) { int radius = (e.Argument as BlurGenTaskData).radius; int width = (e.Argument as BlurGenTaskData).width; int height = (e.Argument as BlurGenTaskData).height; int[] pixels = (e.Argument as BlurGenTaskData).pixels; int[] blur_pixels = pixels.Clone() as int[]; int[] tab = { 14, 10, 8, 6, 5, 5, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 }; int alpha = (radius < 1) ? 16 : (radius > 17) ? 1 : tab[radius - 1]; int r1 = 0; int r2 = height - 1; int c1 = 0; int c2 = width - 1; int[] rgba = new int[4]; for (int col = c1; col <= c2; col++) { int s = r1 * width + col; for (int i = 0; i < 4; i++) { rgba[i] = ((blur_pixels[s] >> (i * 8)) & 0xFF) << 4; } s += width; for (int j = r1; j < r2; j++, s += width) { int p = 0; for (int i = 0; i < 4; i++) { p = p | ((((rgba[i] += ((((blur_pixels[s] >> (i * 8)) & 0xFF) << 4) - rgba[i]) * alpha / 16) >> 4) & 0xFF) << (i * 8)); } blur_pixels[s] = p; } } for (int row = r1; row <= r2; row++) { int s = row * width + c1; for (int i = 0; i < 4; i++) { rgba[i] = ((blur_pixels[s] >> (i * 8)) & 0xFF) << 4; } s++; for (int j = c1; j < c2; j++, s++) { int p = 0; for (int i = 0; i < 4; i++) { p = p | ((((rgba[i] += ((((blur_pixels[s] >> (i * 8)) & 0xFF) << 4) - rgba[i]) * alpha / 16) >> 4) & 0xFF) << (i * 8)); } blur_pixels[s] = p; } } for (int col = c1; col <= c2; col++) { int s = r2 * width + col; for (int i = 0; i < 4; i++) { rgba[i] = ((blur_pixels[s] >> (i * 8)) & 0xFF) << 4; } s -= width; for (int j = r1; j < r2; j++, s -= width) { int p = 0; for (int i = 0; i < 4; i++) { p = p | ((((rgba[i] += ((((blur_pixels[s] >> (i * 8)) & 0xFF) << 4) - rgba[i]) * alpha / 16) >> 4) & 0xFF) << (i * 8)); } blur_pixels[s] = p; } } for (int row = r1; row <= r2; row++) { int s = row * width + c2; for (int i = 0; i < 4; i++) { rgba[i] = ((blur_pixels[s] >> (i * 8)) & 0xFF) << 4; } s--; for (int j = c1; j < c2; j++, s--) { int p = 0; for (int i = 0; i < 4; i++) { p = p | ((((rgba[i] += ((((blur_pixels[s] >> (i * 8)) & 0xFF) << 4) - rgba[i]) * alpha / 16) >> 4) & 0xFF) << (i * 8)); } blur_pixels[s] = p; } } BlurGenTaskData task_data = new BlurGenTaskData(); task_data.radius = radius; task_data.width = width; task_data.height = height; task_data.pixels = blur_pixels; e.Result = task_data; }