예제 #1
0
        public IActionResult GetBinarization([FromBody] BinaryTransferModel data)
        {
            var returnObject = data;
            var image        = ByteArrayToBitmapImage(data.ImageByteArray);

            var obj = data.Parameters;

            int   precision  = obj.PrecisionParameter;
            float adjustment = obj.AdjustmentParameter;
            float rParam     = obj.RedParameter;
            float gParam     = obj.GreenParameter;
            float bParam     = obj.BlueParameter;

            int height = image.PixelHeight,
                width  = image.PixelWidth;

            int[,] integralImage = new int[height, width];

            int stride = image.PixelWidth * 4;
            int size   = image.PixelHeight * stride;

            byte[] pixels = new byte[size];

            image.CopyPixels(pixels, stride, 0);

            for (int i = 0; i < height; i++)
            {
                int sum = 0;
                for (int j = 0; j < width; j++)
                {
                    sum += GetGrayScale(stride, pixels, i, j, rParam, gParam, bParam);
                    if (i == 0)
                    {
                        integralImage[i, j] = sum;
                    }
                    else
                    {
                        integralImage[i, j] = integralImage[i - 1, j] + sum;
                    }
                }
            }

            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    var x1 = i - precision / 2;
                    if (x1 <= 0)
                    {
                        x1 = 1;
                    }
                    var x2 = i + precision / 2;
                    if (x2 >= height)
                    {
                        x2 = height - 1;
                    }
                    var y1 = j - precision / 2;
                    if (y1 <= 0)
                    {
                        y1 = 1;
                    }
                    var y2 = j + precision / 2;
                    if (y2 >= width)
                    {
                        y2 = width - 1;
                    }

                    int count = (x2 - x1) * (y2 - y1);

                    int sum = integralImage[x2, y2] - integralImage[x2, y1 - 1] - integralImage[x1 - 1, y2] + integralImage[x1 - 1, y1 - 1];

                    if ((GetGrayScale(stride, pixels, i, j, rParam, gParam, bParam) * count) <= (sum * (100 - adjustment) / 100))
                    {
                        int index = i * stride + 4 * j;

                        pixels[index]     = 0;
                        pixels[index + 1] = 0;
                        pixels[index + 2] = 0;
                    }
                    else
                    {
                        int index = i * stride + 4 * j;

                        pixels[index]     = 255;
                        pixels[index + 1] = 255;
                        pixels[index + 2] = 255;
                    }
                }
            }
            var resultImage = BitmapImage.Create(
                image.PixelWidth,
                image.PixelHeight,
                image.DpiX,
                image.DpiY,
                image.Format,
                image.Palette,
                pixels,
                stride);

            returnObject.ImageByteArray = BitmapSourceToByteArray(resultImage);
            HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);

            response.Content = new StringContent(JsonConvert.SerializeObject(returnObject), Encoding.UTF8, "application/json");
            return(Ok(returnObject));
        }
예제 #2
0
        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();
            });
        }