一个 HTML5 离线图片编辑器和上传应用程序

许多 Web 应用程序使用图片上传器:图片托管网站、博客发布应用程序、社交网络等等。这些上传器有一些限制:你不能一次上传多个文件,也不能在发送之前编辑图片。插件是上传多个图片的常见解决方案,图片修改通常在服务器端进行,这会使编辑过程变得更加繁琐。

Firefox 3.6 为 Web 开发人员提供了许多新的开放 Web 功能,包括更多 HTML5 支持。本文将介绍如何使用开放 Web 技术创建复杂的图片编辑器和上传器。

请查看下面的演示视频以及一些背景信息。

托管在 hacks 上,发布到 twitpic

我们的 Web 应用程序将图片上传到 twitpic,一个为 Twitter 提供图片托管服务的网站。

请注意,此应用程序的代码实际上托管在hacks Web 服务器上,但仍然可以上传到 Twitpic。能够上传到 Twitpic 是因为他们为类似这样的应用程序开放了他们的 API 用于跨域 XMLHttpRequest。(感谢twitpic!)。

Web 功能

演示使用了 Firefox 3.6 中包含的 HTML5 中的以下功能

  • HTML5 拖放:你可以将项目拖放到网页内,也可以将图片从你的桌面直接拖放到浏览器中。
  • HTML5 localStorage:用于在浏览器重新启动之间存储图片数据
  • HTML5 应用程序缓存:这使你能够创建可以在浏览器未连接到 Internet 时使用的应用程序。它将整个应用程序存储在浏览器中,还提供对在线和离线事件的访问,这样你就能知道何时需要将数据与服务器同步。
  • HTML5 Canvas:整个演示中都使用了 HTML5 Canvas 元素来编辑和渲染图片。
  • 跨域资源共享 用于在一个站点上托管应用程序并在另一个站点上发布数据。

演示中包含什么?

请查看实时演示,亲自尝试一下图片上传器。你需要Firefox 3.6 和一个twitter 帐户。

以下是此应用程序可以执行的所有操作的完整列表

  • 你可以将图片从你的桌面或 Web 拖放到应用程序中。
  • 你可以查看想要上传的每张图片的预览。
  • 你可以将预览拖放到垃圾箱中以删除图片。
  • 如果图片的宽度大于 600 像素,它会自动缩小。
  • 你可以在上传之前编辑任何图片。这包括能够旋转、翻转、裁剪或将图片转换为黑白。
  • 如果你编辑了图片,它会保存在本地,以便你即使在离线时也能进行编辑。如果你关闭了选项卡,重新启动了 Firefox 或你的计算机,这些图片在你再次加载页面时仍然存在,以便你可以在重新连接时上传。
  • 它会一次上传多个文件,并在上传过程中提供反馈。
  • HTML5 离线应用程序缓存使应用程序的加载速度非常快,因为它完全存储在离线状态。

幕后

让我们快速了解一下我们在此应用程序中使用到的所有技术。

跨 XMLHttpRequest

Twitpic 很乐意开放他们的 API 以允许来自任何其他域的 XMLHttpRequest。这意味着你现在可以从自己的网站使用他们的 API 并提供自己的图片上传器。

如果你正在运行一个带有 API 的网站,你希望人们从其他网站使用它,你可以使用跨站点 HTTP 请求。为了支持它,你需要在你的 Web 服务器响应中添加一个 HTTP 标头,说明你允许哪些域。例如,以下是 twitpic 如何允许来自所有域的访问

Access-Control-Allow-Origin: *

需要注意的是,开放你的 API 确实存在安全隐患,因此在盲目开放 API 之前,你应该仔细了解这些问题。有关更多详细信息,请参阅 MDC 关于 CORS 的文档

拖放

拖放 是一种具有两个重要功能的机制

  • 将文件从你的桌面拖放到你的网页。
  • 在你的网页内进行原生拖放(不仅仅是改变元素的坐标)。

图片上传器使用拖放功能来允许用户从桌面添加文件,删除文件(将它们拖放到垃圾箱)以及将新图片插入当前图片。

有关拖放的更多信息,请参阅之前的 hacks 文章,尤其是如何在你的应用程序中使用拖放

使用 Canvas 编辑图片

将图片拖放到网页后,图片上传器允许你在上传之前编辑它们。这是因为图片实际上是通过文件 API复制到 canvas 元素中的。

在这种情况下,编辑过程非常简单:旋转、翻转、添加文本、黑白、裁剪。但是,你可以想象在你的编辑器版本中提供更多其他功能(例如,请参阅Pixastic 或此镶嵌功能此处)。

使用 canvas文件 API 也允许你在发送之前调整图片大小。在这里,每张图片都被转换为一个新的图片(canvas),宽度小于 600 像素。

localStorage:保存本地数据

可以使用 localStorage 在网页中持久存储本地数据,每个域最多可以存储 5 兆字节的数据。

在图片上传器中,localStorage 用于存储图片和凭据。由于图片实际上是 canvas,因此你可以将它们存储为数据 URL

var url = canvas.getContext("2d").toDataURL("image/png");
localStorage.setItem("image1", url);

LocalStorage 支持意味着你可以编辑一张图片,关闭 Firefox,关闭你的计算机,然后在你重新启动 Firefox 时编辑后的图片仍然存在。

离线

如果你添加一个清单文件,列出显示 Web 应用程序所需的所有远程文件,那么即使你未连接到 Internet,它也能正常工作。一个不错的副作用是,它还会使你的应用程序加载速度更快。

在这里,html 元素引用一个清单文件


清单文件如下所示

CACHE MANIFEST

# v2.4
index.xhtml
fonts/MarketingScript.ttf
css/desktop.css
css/fonts.css
css/mobile.css
[...]

你还可以捕获离线和在线事件,以便了解连接状态是否发生了变化。
有关更多信息,请参阅我们关于离线的上一篇文章.

结论

Firefox 3.6 使数百万用户能够利用现代标准,包括 HTML5。
这里介绍的图片上传器展示了网页如何真正被视为一个应用程序,因为它可以与你的桌面交互并在离线状态下工作。

以下是一些使用开放 Web 技术编写下一个应用程序的提示

允许跨 XMLHttpRequest
如果对你的服务有意义,请允许人们从不同的域访问你的 API,你会惊讶于人们会想出多少应用程序。

允许多个输入
让人们将文件拖放到你的应用程序中,并使用 <input type="file" multiple="">,以便他们可以一次选择多个文件。在此演示中,我们使用一个仅在移动版本中可见的多输入,但出于可访问性考虑,请不要忘记使用它来提供拖放的替代方案。

使用原生拖放
拖放机制通常是模拟的(在 mousemove 事件上更新坐标)。如果可以,请使用原生机制。

使用文件 API
在与服务器通信之前预处理文件。

支持离线
存储数据并使用清单文件使你的应用程序数据在离线状态下持久化。

使用 Canvas
Canvas 是最广泛实现的 HTML5 元素。它在所有地方都能正常工作(即使它需要模拟),请使用它!

思考“客户端”:HTML5、CSS3 和新的强大 JavaScript 引擎使你能够创建令人惊叹的应用程序,充分利用它们!

我们期待看到你使用开放 Web 技术创建的精彩新应用程序!

关于 Paul Rouget

Paul 是一位 Firefox 开发人员。

更多 Paul Rouget 的文章……


44 条评论

  1. Paul Rouget

    注意:如果你安装了 Jetpack,它在 Linux 上无法正常工作(请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=534767)。

    2010 年 2 月 2 日 上午 09:10

  2. Paul

    你用于裁剪和黑白图标的 Unicode 字符在我的 Windows XP 上没有显示出来。

    另外,在随机应用程序中输入你的用户名和密码通常不是一个好主意。是否可以改用 OAuth?

    2010 年 2 月 2 日 上午 09:16

  3. Fritz

    很棒!

    有一件事。在 Windows 中,当你将表情符号拖放到图片上时,它会显示一个点线矩形,就像你移动任何图片时一样(这不是拖放功能)。有没有办法禁用它?

    2010 年 2 月 2 日 上午 09:48

  4. Francisco Collao

    太棒了!

    2010 年 2 月 2 日 上午 10:39

  5. Sam

    它在 Firefox 上运行良好,但在 Safari 或 Chrome 上无法正常工作。

    2010 年 2 月 2 日 下午 10:55

  6. sep332

    > 使用 localStorage 可以将本地数据持久存储在网页中,每个域最多 5Mb 数据。

    我很确定是 5MB,而不是 Mb。
    /nitpick

    2010 年 2 月 2 日 下午 10:59

  7. […] 将您的图片放到 TwitPicYou 中的 serverUploaded 图片中,您也可以查看 Mozilla Hacks 上的官方博客文章。那么您觉得怎么样呢?它真的让您的工作更轻松了吗?在 […]

    2010 年 2 月 2 日 下午 11:41

  8. thinsoldier

    Sketchpad > Pixastic

    http://mugtug.com/sketchpad/

    2010 年 2 月 2 日 下午 12:49

  9. bohwaz

    在 Linux 上使用 ROX-filer(gtk 文件浏览器)或 dolphin(Qt)的 ff 3.6 中不起作用,尽管拖放区有这种小的缩放效果,但拖放后没有任何反应。

    有趣,当然。

    2010 年 2 月 2 日 下午 5:30

  10. […] 离线图片编辑器和上传器 - 拖放 API、DOM 存储、应用程序缓存、画布、跨域共享功能等。由 Mozilla Hack […]

    2010 年 2 月 2 日 下午 5:34

  11. Ryan

    非常棒的东西,Paul。

    localStorage 在 3.6 中是否已增加?当我使用 3.5 中的 localStorage 时,当我尝试存储的数据大小超过 1024kb 时,会遇到异常…

    2010 年 2 月 2 日 下午 5:52

  12. Dwight Stegall

    上传器很酷,但我认为我还要再用一段时间 Photoshop。:)

    2010 年 2 月 2 日 晚上 7:09

  13. Jigar shah

    令人印象深刻…真的很棒。很快 picasaweb/flickr 可能会出现一个…或者 piknik 会升级网页 :)

    2010 年 2 月 2 日 晚上 10:53

  14. BWRic

    太棒了!非常适合喜欢上传大型图片的客户!

    2010 年 2 月 3 日 上午 3:12

  15. Gourmet

    令人印象深刻,当然。
    我们现在都在等待 Prism(针对 Gecko 1.9.1)的升级,以便从 Web 应用程序中全新的 API 中获益!

    顺便说一下,有人能告诉我是否现在可以在 Firefox 中开发 SIP 客户端吗?
    一个能够进行视频和音频通话的 SIP 客户端(这意味着能够编码/解码 Theora 和 encore/解码 vorbis 以及使用 SIP 进行通话)。
    db

    2010 年 2 月 3 日 上午 4:33

  16. Hasan Köroğlu

    太棒了!!!

    2010 年 2 月 4 日 上午 1:14

  17. Paul Rouget

    @Gourmet 是的,使用 prism 会很棒 :)
    对于 SIP,目前还不可行。

    @Ryan 是的,5MB。

    @bohwaz 您是对的。听起来它只适用于 Nautilus。

    2010 年 2 月 5 日 下午 1:26

  18. Paulo

    太棒了!HTML5 为新项目看起来非常有趣!
    迫不及待地想看到 IE 彻底消失。Firefox 应该超越所有浏览器!

    2010 年 2 月 6 日 下午 4:40

  19. Jorge

    它只在 FF 中有效吗?如果是的话,那真是浪费时间,因为我希望我的系统对所有浏览器(如 IE、Opera 等)具有互操作性。

    2010 年 2 月 9 日 上午 7:39

  20. Paul Rouget

    @Jorge 目前是,是的。但和其他标准一样,其他浏览器也会实现它。

    2010 年 2 月 13 日 上午 5:35

  21. kedar

    你好,

    我找不到下载演示的链接?有吗?

    我想动手尝试一下,开始探索它…

    谢谢
    Kedar。

    2010 年 2 月 19 日 上午 3:52

  22. Paul Rouget

    @kedar 只需查看源代码(view-source)。

    2010 年 2 月 22 日 上午 3:05

  23. kedar

    还有一个问题,关于 manifest=”offline.manifest” ,这个 offline.manifest 文件存储在哪里?

    我在用 Ubuntu

    2010 年 2 月 22 日 上午 3:25

    1. marvin

      我非常确定它存储在服务器上的任何位置,然后将路径包含在 .html 文件中,如下所示:(如果 offline.manifest 在同一个目录中)

      2010 年 2 月 27 日 上午 4:59

  24. Julien

    你好,Paul,

    我昨天想在 Windows XP 计算机上展示这个很棒的演示,但在尝试删除图片(拖放到回收站)时遇到了问题…无法拖放。

    似乎 Windows 中的“链接”拖放效果无法正常工作,但“移动”效果似乎解决了问题。

    我不知道这是否是解决此问题的真正方法。

    2010 年 2 月 25 日 下午 11:45

  25. Anonbuntu

    我没有安装 Jetpack(从未安装过),它仍然在 Ubuntu 上无法工作。当我将图片拖到拖放区时,它会改变大小,表示它注意到我在拖放图片,但当我放下图片时,没有任何反应。

    2010 年 3 月 12 日 上午 2:24

  26. Matthieu

    你好,Paul,

    有一件事我不明白该怎么做!我查看了源代码,但我仍然不明白。
    当您拖动图片将其发送到回收站时,它会“删除”原始缩略图,只显示正在替换的缩略图。这不是可拖动图片的默认行为,您是如何做到的?

    谢谢!

    2010 年 3 月 12 日 上午 10:19

  27. farquaad

    不再有效了。我想是因为 Twitpic 迁移到了 OAuth。

    2010 年 4 月 26 日 上午 5:15

    1. Paul Rouget

      是的。他们不再允许跨 XHR 了 :(

      2010 年 4 月 26 日 上午 5:41

  28. […] 一个 HTML5 离线图片编辑器和上传器应用程序,2010 年 2 月 2 日,Paul […]

    2010 年 7 月 7 日 上午 9:03

  29. Komrade Killjoy

    Mozilla 发明了 AIR?

    2010 年 7 月 28 日 上午 5:43

  30. Benjamin Lupton

    源代码是否可用?

    2010 年 10 月 6 日 上午 10:13

    1. Paul Rouget

      @Benjamin: ctrl+u

      2010 年 10 月 7 日 上午 5:27

      1. Sebastian Becker

        你好,Paul,

        非常感谢您精彩的演示,以及概念验证。

        演示的所有外部 JavaScript 文件对于上传功能的正常工作是否都必需?

        您能帮忙发布一下服务器端代码吗?(或者最好是提供一个完整可用的脚本的压缩版本,去掉不必要的代码部分)。这将非常有帮助…

        谢谢,

        Sebastian

        2011 年 2 月 21 日 晚上 8:01

  31. kishore konjeti

    当我们从桌面拖放时,拖放功能有效。从资源管理器中拖放时无效。

    2011 年 3 月 1 日 晚上 9:54

  32. Brandone Donnelson

    很棒的演示!

    http://code.google.com/p/gwt-examples/wiki/gwt_hmtl5 - 我的 GWT 图片缩放…

    2011 年 3 月 26 日 上午 11:04

  33. […] url: https://hacks.mozilla.ac.cn/2010/02/an-html5-offline-image-editor-and-uploader-application/ […]

    2011 年 5 月 28 日 上午 4:19

  34. tikam chandrakar

    我正在寻找用于在移动浏览器中录制音频或裁剪图片的 API 或插件,请告诉我是否有可用的 API。否则请提供任何解决方案。
    在 jQuery 中

    谢谢
    Tikam

    2011 年 6 月 8 日 上午 9:14

  35. […] by Andrew Grieve • “调试 HTML 5 离线应用程序缓存”,作者:Jonathan Stark • “一个 HTML5 离线图片编辑器和上传器应用程序”,作者:Paul Rouget       最后感谢所有参与的人 By : Amar Omar Ashour Like this:LikeBe […]

    2011 年 8 月 16 日 下午 2:06

  36. ling

    太可惜了,演示的链接已失效。
    请问有人可以再次发布一个可用的演示链接吗?

    2012 年 6 月 30 日 上午 11:47

    1. bates

      太可惜了 :{ ,请重新发布!

      2012 年 8 月 27 日 上午 1:39

  37. Sam

    我使用 Chrome 浏览器,因为 Firefox 经常给我带来问题。但由于这个应用程序,我现在会对 Firefox 友好一些。我真的很需要一个 HTML5 离线编辑器。我是一个大量的图片上传者,如果可以的话,我不希望有任何限制,所以这个应用程序对我来说就像一份礼物。

    2012 年 10 月 4 日 上午 6:45

  38. ling

    演示源代码可以在此处找到
    https://github.com/paulrouget
    在 hacks.mozilla archives 文件夹中
    ;)

    2012 年 10 月 4 日 下午 12:16

  39. Sam

    太可惜了!我不经常使用 Firefox,因为它太慢了。但看来我现在别无选择,因为我非常需要这个 HTML 图片编辑器。我现在不使用 Photoshop 了,我想要一些新的东西。但我希望 picasaweb 很快也会推出一个。我迫不及待!

    2012 年 10 月 26 日 上午 12:01

本文评论已关闭。