예제 #1
0
        public async Task <IHttpActionResult> Filter(string flt, string crd)
        {
            var tracer = Request.GetConfiguration().Services.GetTraceWriter();

            if (!Request.TryToBitmap(out var img) || img.PixelFormat != PixelFormat.Format32bppArgb ||
                img.Width > 1000 || img.Height > 1000)
            {
                tracer.Info(Request, ControllerContext.ControllerDescriptor.ControllerType.FullName, "Incorrect PNG");
                return(BadRequest());
            }

            var rect = (Rectangle)(new RectangleConverter().ConvertFromInvariantString(crd) ?? Rectangle.Empty);

            rect = Rectangle.Intersect(rect.Normalise(), new Rectangle(0, 0, img.Width, img.Height));
            if (rect.IsEmpty || rect.Width == 0 || rect.Height == 0)
            {
                tracer.Info(Request, ControllerContext.ControllerDescriptor.ControllerType.FullName, "Empty rectangle");
                return(StatusCode(HttpStatusCode.NoContent));
            }

            tracer.Info(Request, ControllerContext.ControllerDescriptor.ControllerType.FullName, "Filter begin");
            img    = img.Clone(rect, img.PixelFormat);
            rect.X = 0;
            rect.Y = 0;
            var bytes      = rect.Width * rect.Height;
            var argbValues = img.ToArray(rect);
            var filter     = ImageFilters.FromString(flt, out var byteLevel);


            for (var i = 0; i < bytes; i++)
            {
                argbValues[i] = filter((uint)argbValues[i], byteLevel);
            }

            tracer.Info(Request, ControllerContext.ControllerDescriptor.ControllerType.FullName, "Filter end");

            return(await Task.FromResult(new OkResult(argbValues.ToBitmap(rect.Width, rect.Height))));
        }