WCF背后的ImageResizing.Net

INN*_*VTV 0 c# asp.net wcf image-resizing imageresizer

我一直在评估Nathanael Jones 令人惊叹的成像库和插件,用于我公司在Azure上构建的一些图像处理服务.在获得许可证之前,我们会对它们进行全面测试,以确保它们符合我们的方案.帮自己一个忙,在这里检查一下.

在ASP.NET MVC Web应用程序中使用插件时,我在插件方面取得了巨大成功.我正在使用我在UI中发布的Controller中的图像服务器功能.裁剪,调整大小和简单/高级过滤器正在按预期工作.

我遇到的问题是当我将此功能作为该应用程序中的类库移动到WCF服务时.裁剪和调整大小的工作完全符合预期,但所有过滤指令(亮度,对比度,棕褐色等)都被忽略或无声地失败.这是图像处理代码:

var instructions = new ImageResizer.Instructions();

//All of these instructions work
instructions.Width = 300;
instructions.Height = 300;
instructions.Mode = ImageResizer.FitMode.Crop;
instructions.OutputFormat = ImageResizer.OutputFormat.Jpeg;
instructions.JpegQuality = 90;  
double[] cropCoordinates = {0,100,0,100};
instructions.CropRectangle = cropCoordinates;       
instructions.Mode = ImageResizer.FitMode.Crop;

//These instructions are ignored, or fail silently
instructions.Invert = true;
instructions.Saturation = -1;
instructions.Sepia = true;

var imageJob = new ImageResizer.ImageJob();

imageJob.Instructions  = instructions;
imageJob.Source = bmpSource;
imageJob.Dest = typeof(Bitmap);

imageJob.Build(); 
Run Code Online (Sandbox Code Playgroud)

我已经将我的MVC应用程序使用的Web.Config设置复制到使用ImageResizing包(来自Nuget)的类库的App.Config.

<configuration>
    <configSections>
        <section name="resizer" type="ImageResizer.ResizerSection" requirePermission="false" />
    </configSections>

    <resizer>
        <plugins>
            <add name="SimpleFilters" />
            <add name="AdvancedFilters" />
        </plugins>
    </resizer>

</configuration>
Run Code Online (Sandbox Code Playgroud)

而且,为了确保,我还包括使用主库和插件的语句:

using ImageResizer;
using ImageResizer.Plugins.AdvancedFilters;
using ImageResizer.Plugins.SimpleFilters;
Run Code Online (Sandbox Code Playgroud)

正如我所提到的,当移动到具有WCF服务的类库时,裁剪和调整大小工作完美,但过滤器无声地失败.图像按照指示进行裁剪和调整,但滤镜不会应用于图像.我已经尝试了几种安装库的变体(甚至包括我的解决方案中的每个项目的包).

事实上我的W​​CF服务是作为NET.TCP端点托管的吗?我是否应该考虑更新我的架构,以便通过WCF服务发布到的Web API提供映像服务?

更新

我通过在代码中安装插件来绕过Web.Config/App.Config:

ImageResizer.Configuration.Config.Current.Plugins.Install(new ImageResizer.Plugins.SimpleFilters.SimpleFilters());
ImageResizer.Configuration.Config.Current.Plugins.Install(new ImageResizer.Plugins.AdvancedFilters.AdvancedFilters());
Run Code Online (Sandbox Code Playgroud)

我已经验证插件现在已加载到:

ImageResizer.Configuration.Config.Current.Plugins
Run Code Online (Sandbox Code Playgroud)

我在imageJob.Build()遇到以下错误 叫做:

无法加载文件或程序集'AForge.Imaging,Version = 2.2.5.0,Culture = neutral,PublicKeyToken = ba8ddea9676ca48b'或其依赖项之一.该系统找不到指定的文件.

希望这是配置的另一个问题我已经在使用ImageResizer的类的顶部添加了以下using语句:

using AForge;
using AForge.Imaging;
using AForge.Imaging.Filters;
using AForge.Imaging.ColorReduction;
using AForge.Imaging.ComplexFilters;
using AForge.Imaging.Textures;
Run Code Online (Sandbox Code Playgroud)

配置问题已解决,但我仍然得到AForge库的相同错误.在这里为这个具体问题开了一个新问题

Lil*_*ver 5

我怀疑配置没有被加载.您可以通过调试和检查ImageResizer.Configuration.Config.Current实例来访问诊断页吗?

您可以考虑通过代码配置软件 - 创建新的Config实例并在其上安装插件,然后将其用于每个图像作业.

总的来说,我肯定建议将它用作HttpModule,就像预期的那样 - 特别是如果你想要杠杆磁盘缓存.

  • 如果问题不是专门 - 而且是专门 - 关于产品 - 我会同意你的看法.作为答案,我绝不会推销任何东西,这是需要披露的主要原因. (3认同)
  • 作为第三方的价值......我同意@NathanaelJones的观点.他不应该为他给出的每一个答案复制/粘贴免责声明,以免它成为参与社区的障碍.当然,如果他在另一个不相关的问题的背景下提出这个问题,那么肯定......从道德的角度来看这是有意义的......但是当它被标记为[imageresizer]时 (2认同)