public IActionResult GetGauss([FromBody] GaussTransferModel data) { var returnObject = data; var image = ByteArrayToBitmapImage(data.ImageByteArray); var kernel = data.Parameters as GaussFilterParams; int height = image.PixelHeight, width = image.PixelWidth; int stride = image.PixelWidth * 4; int size = image.PixelHeight * stride; byte[] outputImagePixels = new byte[size]; byte[] inputImagePixels = new byte[size]; image.CopyPixels(outputImagePixels, stride, 0); image.CopyPixels(inputImagePixels, stride, 0); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { float leftTop, midTop, rightTop, leftMid, mid, rightMid, leftBot, midBot, rightBot; for (int rgbParam = 0; rgbParam < 3; rgbParam++) { //Left Top if (j - 1 < 0 || i - 1 < 0 || i - 1 < 0) { leftTop = inputImagePixels[(i * stride + 4 * j) + rgbParam] * kernel.LeftTop; } else { leftTop = inputImagePixels[((i - 1) * stride + 4 * (j - 1)) + rgbParam] * kernel.LeftTop; } //Mid Top if (i - 1 < 0) { midTop = inputImagePixels[(i * stride + 4 * j) + rgbParam] * kernel.MidTop; } else { midTop = inputImagePixels[((i - 1) * stride + 4 * j) + rgbParam] * kernel.MidTop; } //Right Top if (i - 1 < 0 || j >= width - 1) { rightTop = inputImagePixels[(i * stride + 4 * j) + rgbParam] * kernel.RightTop; } else { rightTop = inputImagePixels[((i - 1) * stride + 4 * (j + 1)) + rgbParam] * kernel.RightTop; } //Left Mid if (j - 1 < 0) { leftMid = inputImagePixels[(i * stride + 4 * j) + rgbParam] * kernel.LeftMid; } else { leftMid = inputImagePixels[(i * stride + 4 * (j - 1)) + rgbParam] * kernel.LeftMid; } //Mid mid = inputImagePixels[(i * stride + 4 * j) + rgbParam] * kernel.Mid; //Right Mid if (j >= width - 1) { rightMid = inputImagePixels[(i * stride + 4 * j) + rgbParam] * kernel.RightMid; } else { rightMid = inputImagePixels[(i * stride + 4 * (j + 1)) + rgbParam] * kernel.RightMid; } //Left Bot if (j - 1 < 0 || i >= height - 1) { leftBot = inputImagePixels[(i * stride + 4 * j) + rgbParam] * kernel.LeftBot; } else { leftBot = inputImagePixels[((i + 1) * stride + 4 * (j - 1)) + rgbParam] * kernel.LeftBot; } //Mid Bot if (i >= height - 1) { midBot = inputImagePixels[(i * stride + 4 * j) + rgbParam] * kernel.MidBot; } else { midBot = inputImagePixels[((i + 1) * stride + 4 * j) + rgbParam] * kernel.MidBot; } //Right Bot if (i >= height - 1 || j >= width - 1) { rightBot = inputImagePixels[(i * stride + 4 * j) + rgbParam] * kernel.RightBot; } else { rightBot = inputImagePixels[((i + 1) * stride + 4 * (j + 1)) + rgbParam] * kernel.RightBot; } var tempResult = (leftTop + midTop + rightTop + leftMid + mid + rightMid + leftBot + midBot + rightBot) / kernel.KernelSum; outputImagePixels[(i * stride + 4 * j) + rgbParam] = (byte)tempResult; } } } var returnImage = BitmapImage.Create( image.PixelWidth, image.PixelHeight, image.DpiX, image.DpiY, image.Format, image.Palette, outputImagePixels, stride); returnObject.ImageByteArray = BitmapSourceToByteArray(returnImage); return(Ok(returnObject)); }
private void InitializeCommands() { AddGaussFilterCommand = new RelayCommand(async x => { var filter = GaussFilterParams.Clone() as GaussFilterParams; CurrentFilters.Add(filter); EditedImage.PhotoData.CurrentFilters.Add(filter); if (ServerModeEnabled) { using (var client = new HttpClient()) { client.DefaultRequestHeaders.Add("Accept", "application/json"); var transferObject = new GaussTransferModel() { ImageByteArray = ioService.BitmapSourceToByteArray(EditedImage.CurrentImage), Parameters = filter }; var request = new HttpRequestMessage(HttpMethod.Post, "https://localhost:44337/weatherforecast/GetGauss"); request.Content = new StringContent(JsonConvert.SerializeObject(transferObject), Encoding.UTF8, "application/json"); var response = await client.SendAsync(request); if (response.StatusCode == System.Net.HttpStatusCode.OK) { var jsonString = await response.Content.ReadAsStringAsync(); var resultImg = JsonConvert.DeserializeObject <GaussTransferModel>(jsonString); EditedImage.CurrentImage = ioService.ByteArrayToBitmapImage(resultImg.ImageByteArray); } } } else { EditedImage.CurrentImage = imageFilterService.ApplyFilter(EditedImage.CurrentImage, filter); } }); AddBinarizationFilterCommand = new RelayCommand(async x => { var filter = BinarizationFilterParams.Clone() as BinarizationFilterParams; CurrentFilters.Add(filter); EditedImage.PhotoData.CurrentFilters.Add(filter); if (ServerModeEnabled) { using (var client = new HttpClient()) { client.DefaultRequestHeaders.Add("Accept", "application/json"); var transferObject = new BinaryTransferModel() { ImageByteArray = ioService.BitmapSourceToByteArray(EditedImage.CurrentImage), Parameters = filter }; var request = new HttpRequestMessage(HttpMethod.Post, "https://localhost:44337/weatherforecast/GetBinarization"); request.Content = new StringContent(JsonConvert.SerializeObject(transferObject), Encoding.UTF8, "application/json"); var response = await client.SendAsync(request); if (response.StatusCode == System.Net.HttpStatusCode.OK) { var jsonString = await response.Content.ReadAsStringAsync(); var resultImg = JsonConvert.DeserializeObject <BinaryTransferModel>(jsonString); EditedImage.CurrentImage = ioService.ByteArrayToBitmapImage(resultImg.ImageByteArray); } } } else { EditedImage.CurrentImage = imageFilterService.ApplyFilter(EditedImage.CurrentImage, filter); } }); SavePhotoCommand = new RelayCommand(x => { ioService.ExportImage(editedImage); NavigationService.MoveToPage(Enums.PageEnum.galleryPage); }); CancelPhotoCommand = new RelayCommand(x => { NavigationService.MoveToPage(Enums.PageEnum.galleryPage); }); RemoveSelectedFilter = new RelayCommand(x => { if (SelectedFilter == null) { return; } var filterToRemove = SelectedFilter; CurrentFilters.Remove(filterToRemove); EditedImage.PhotoData.CurrentFilters.Remove(filterToRemove); imageFilterService.ReApplyFilters(editedImage); SelectedFilter = CurrentFilters.FirstOrDefault(); }); }