Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ASP.NET创建精灵图像_Asp.net_Asp.net Mvc_Css Sprites_Imageresizer - Fatal编程技术网

使用ASP.NET创建精灵图像

使用ASP.NET创建精灵图像,asp.net,asp.net-mvc,css-sprites,imageresizer,Asp.net,Asp.net Mvc,Css Sprites,Imageresizer,我有一个重大的性能问题。问题是在我的一个网站上有一个滑块,可以调用大约180幅图像。这180个图像中的每一个都由客户端浏览器通过单独的url下载。它们是GIF和jpg的混合体,我想将它们组合成一幅图像;最好是jpg,因为透明度不是问题。图像存储在SQL数据库中,并通过MVC控制器显示。我想这个精灵也可以通过MVC控制器创建,而不是更传统的通用ashx处理程序 我在谷歌上搜索了一下,发现了一个问题。这篇文章解释了如何组合检查图像,并做了我想做的事情。它写于2005年,所以我很好奇是否有更好的方法。

我有一个重大的性能问题。问题是在我的一个网站上有一个滑块,可以调用大约180幅图像。这180个图像中的每一个都由客户端浏览器通过单独的url下载。它们是GIF和jpg的混合体,我想将它们组合成一幅图像;最好是jpg,因为透明度不是问题。图像存储在SQL数据库中,并通过MVC控制器显示。我想这个精灵也可以通过MVC控制器创建,而不是更传统的通用ashx处理程序

我在谷歌上搜索了一下,发现了一个问题。这篇文章解释了如何组合检查图像,并做了我想做的事情。它写于2005年,所以我很好奇是否有更好的方法。我一直在另一个项目中使用ImageResizer。我听了与项目创始人的对话,谈到如何使用IIS和.NET调整图像大小。我从那个播客和我的经验中得知,.NET和IIS中的图像处理可能会变得很奇怪


以这种方式调整图像大小并将其合并到精灵中仍然是一个好主意吗?我不想要精灵生成器,我想要一种高效的方法将.gif和jpg组合成一个可以用作精灵的图像。

我不建议将所有内容组合成一个图像,因为你会延迟任何图像的“初始外观”,直到整个文件下载。最好让可见的内容尽快加载,并优化其余内容以获得总体吞吐量

例如,如果每个图像小于50KB,将它们组合为sprite图像可能是有意义的,但我建议一次组合10个。如果图像很小,比如每个5KB,一次30张是合理的

这里有一系列的瓶颈需要担心

  • HTTP开销和并发连接限制(sprite图像对此有帮助)
  • 服务器吞吐量开销(可通过正确的磁盘缓存和边缘缓存解决)
  • 浏览器渲染开销(精灵最适合图标和小缩略图;它们不应该太大,尽量将其控制在100万像素以下) 将现有图像连接在一起并以jpeg格式重新压缩有时可以改进压缩,有时会引入伪影。例如,混合线条艺术和照片是一个坏主意。Jpeg在线条艺术方面不好。使用PNG,如果需要,甚至可以使用PNG-8。有时你会发现100%质量的JPEG最终比GIF或PNG版本小,但大多数情况下,线条艺术最好以PNG形式存储

    如果您有这些照片的ID,并计划使用磁盘缓存进行动态路由,那么它确实会大大简化您的任务

    这个库可以让你很容易地“插入”到它的动态管道和磁盘缓存系统中

    在本例中,您将使用和
    IVirtualBitmapFile
    。有关生成位图并让管道处理其余部分的简单示例,请参见

    您必须定义url语法,并在FileExists和GetFile方法中查找它。类似于/combineimages.ashx?idlist=34,56,79,23&dir=horizontal&width=50&height=50

    然后,您必须加载每个图像,将其大小调整为位图实例,并在分配的画布上绘制

    大多数瓶颈可能是从SQL中提取图像。如果服务器上的RAM有限,串行方法可能比并行方法更安全(即,从SQL一次获取一个映像,调整大小并绘制它,处理数据,然后继续)。如果您的源图像一开始很小,那么多线程处理可能就可以了。请记住,即使是缓存在磁盘上,也需要使其快速运行,因为请求默认在30秒后超时。如果做得好,你应该能够在2秒内为一个10图像精灵提供一个空磁盘缓存,一旦缓存20毫秒

    如果这看起来有点势不可挡,我会提供,但有一个队列


    每个请求一个文件的方法有很多优点,在加入Sprite之前,不妨尝试ImageResizer的磁盘缓存和SqlReader插件。并不是说这是一种错误的方法,但未缓存的MVC+SQL可能会增加很多开销,这可能是原因之一。

    在您尝试增强的、尖端的、折叠成第四维代码之前,您希望我们中的一位发布,不如先试用Scott的解决方案,看看这对你是否有效?继续在Scott的博客上寻找最近对猫的打击:Scott Mitchell在这里也有一个演练:干杯。*我应该注意到,我通常不会宽恕对猫的打击。不幸的是,我在发布问题之前发现了这些。我想做的是比这低一级。不过谢谢。:-)