6

我们正在维护一个大型 Web 应用程序中的图像媒体数据库。高分辨率 jpg 文件很大(> 15MB),不得以任何方式下载。现在我们需要向客户端提供对图像细节(裁剪)的访问(如放大功能)。客户应该看到图像的缩小版本,并且能够选择要在全比例模式下查看的区域 (100%)。

如何以最高效的方式(流量和 CPU 方面)实现这一点?只要高分辨率图像文件仍然受到保护,我们愿意接受任何解决方案。该应用程序是在 c# 和 .net framework 3.5 中开发的。

有任何想法吗?提前致谢!

4

7 回答 7

1

您需要做的第一件事是在将图像上传到服务器之前对其进行压缩和加水印。然后将这些呈现给用户。这将占用最少的 CPU 资源,因为它们的图像将是静态的。

然后,我个人会将图像裁剪为全尺寸版本,并将它们与压缩后的图像放在一起。通过这种方式,客户可以查看完整图像(尽管已压缩和加水印)以及完整高分辨率版本的小样本。

您可能希望避免即时图像处理,除非您的客户端数量较少且服务器非常强大。

于 2008-12-17T12:43:37.133 回答
0

我会向浏览器提供图像的低分辨率版本,并有一个客户端裁剪 ui,然后将请求发送回服务器,服务器将裁剪选择并以高分辨率发送回。

于 2008-12-17T12:44:00.737 回答
0

就像我对我父亲说的那样(不明白互联网是如何运作的),如果你可以在网页上看到它,你可以保存它,这只是如何做的问题。

于 2008-12-17T12:55:02.323 回答
0

您可能会喜欢 Deep Zoom 的 ajax 版本 - 请参阅 Dragon:

http://livelabs.com/seadragon-ajax/gallery/

向用户呈现图像的低分辨率版本;然后他们可以放大他们喜欢的任何部分。

于 2008-12-17T13:01:59.983 回答
0

首先,我会预渲染所有全尺寸图像的水印版本,并将它们保存为压缩文件格式,以及预渲染的低分辨率版本。

我会为浏览提供低分辨率图像。然后水印高分辨率图像供用户设置裁剪。

在确认时,我将拥有第二个专用图像处理服务器,它裁剪非水印图像,将裁剪后的图像传递给网络服务器,然后将其发送给客户端。

话虽如此,仍然有可能创建一个客户端脚本,将裁剪的部分进行裁剪并将它们拼接在一起以创建无水印图像的全尺寸副本。

于 2008-12-17T14:38:58.803 回答
-1

不得以任何方式提供下载。

不符合:

客户应该看到图像的缩小版本,并且能够选择要在全比例模式下查看的区域 (100%)。

...在您允许以全分辨率查看图像的所有区域时,可以将整个图像拼接在一起。因此,您可以有效地(如果非常不便)使全尺寸图像可用。

但是,这些都不能帮助您实现目标。

我这样做的方法是提供一个 72dpi 水印副本,用于选择要下载的图像区域。如果屏幕空间是一个问题,您可以将其缩放到原始的 %。让用户选择左上角和右下角坐标。然后使用 imagemagick 之类的东西从原始文件中复制该区域以提供给用户。

如果您需要节省资源,您可以让用户从预定义的网格中下载,因此第一次选择网格坐标 14:11 时,image_1411_crop.jpg 被写入文件系统,下次选择该坐标时,文件已存在。

编辑:阅读您对其他答案的一些评论......

无论您采用何种方式生成和服务器端缓存,您都将使用相同数量的带宽和流量。300dpi jpeg 是 300dpi jpeg,无论它是刚刚生成还是位于文件系统上。

您必须确定是否需要节省 CPU 或磁盘空间。如果你有一百万个图像并且只有 40 个用户,你可以承受 CPU 的冲击。如果您有 40 张图片和一百万用户,请选择 HDD。

于 2008-12-17T13:53:34.653 回答
-2

我会使用S3进行存储。创建两个存储桶(公共受保护),一旦您授权用户下载它们,就提供受保护存储桶图像的 url。S3 Urls 可以通过到期日期变得平静。

对于 15Mb 的图像,您可能会意识到您需要提前预生成缩放/裁剪的版本。

除了原始文件,我会在所有文件上使用某种水印。(如谷歌地图)

[编辑:为缩放添加了深度缩放]

查看 Silverlight Deep Zoom以管理裁剪和缩放(演示)。他们甚至有一个实用程序来生成所有裁剪的图像。

于 2008-12-17T12:41:56.687 回答