像素化整个网页

2024-01-09

我了解如何缩放小画布以制作具有厚实而不是模糊像素的大画布。

有什么方法可以让整个网页显示为厚实的 2x2 或 3x3 像素吗?即用最近邻缩放来放大它。我想使用普通 HTML,但将其像素化以获得仿 8 位外观。


很酷的主意。我想如果你不关心性能的话这并不太难。

Edit:我花了一整天的时间进行研究,做了很多测试并编写了自己的小例子。这些是我的结果:

选项 1:静态 SVG 滤镜

谢谢阿莫里·汉瑟.

您可以定义 svg 过滤器并在 css 中使用它:(请参阅https://stackoverflow.com/a/66625778/6292230 https://stackoverflow.com/a/66625778/6292230)

这个解决方案在各个方面都很漂亮。

然而,苹果不喜欢你。一些过滤器或属性是Safari 不支持在 macOS 和 iOS 上。例如:当用作 CSS 过滤器时,Safari 会忽略 x、y、宽度、高度,这使得大多数解决方案毫无用处。如果您可以控制环境(例如 WebView、Electron...),这是最好的解决方案。

选项 2:动态 SVG 滤镜

计算工作量:每个视口调整大小/页面加载一次

这应该可以跨浏览器工作。在最新的 Safari、Chrome 和 Firefox (macOS) 上进行了测试。 您可以使用选项 1 中所述的类似技术。 但是,您必须将点阵渲染到屏幕外画布并将其注入 svg 过滤器中。每次视口大小发生变化时(例如,在调整大小事件之后),您都必须重新进行计算。

工作代码和盒子示例:https://codesandbox.io/s/pixelate-page-demo-dt6w0?file=/src/index.js https://codesandbox.io/s/pixelate-page-demo-dt6w0?file=/src/index.js (如果没有显示效果,请点击右侧iframe中的重新加载按钮)

  1. 在你的体内创建一个空的 svg 过滤器
<body>
    <svg>
      <filter
        id="pixelate"
        x="0"
        y="0"
        width="700"
        height="900"
        filterUnits="userSpaceOnUse"
      ></filter>
    </svg>
</body>
  1. 动态创建并注入 svg 过滤器,如下所示
function pixelate(tileSize = 10, sigmaGauss = 2) {
  tileSize = tileSize < 1 ? 1 : tileSize;
  sigmaGauss = sigmaGauss < 1 ? 1 : sigmaGauss;

  const canvas = document.createElement("canvas");
  const ctx = canvas.getContext("2d");

  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;

  ctx.fillStyle = "black";
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  // only to make the output visible
  // document.body.appendChild(canvas);

  const rows = canvas.height / tileSize;
  const cols = canvas.width / tileSize;
  for (let r = 0; r < rows; r++) {
    for (let c = 0; c < cols; c++) {
      ctx.fillStyle = "white";

      ctx.fillRect(
        c * tileSize - 1 + Math.floor(tileSize / 2),
        r * tileSize - 1 + Math.floor(tileSize / 2),
        1,
        1
      );
    }
  }

  const pixelate = document.getElementById("pixelate");
  pixelate.innerHTML = "";

  const blur = document.createElementNS(
    "http://www.w3.org/2000/svg",
    "feGaussianBlur"
  );
  blur.setAttribute("in", "SourceGraphic");
  blur.setAttribute("stdDeviation", sigmaGauss);
  blur.setAttribute("result", "blurred");

  const hmap = document.createElementNS(
    "http://www.w3.org/2000/svg",
    "feImage"
  );
  const hmapUrl = canvas.toDataURL();
  hmap.setAttribute("href", hmapUrl);
  hmap.setAttribute("result", "hmap");

  const blend = document.createElementNS(
    "http://www.w3.org/2000/svg",
    "feBlend"
  );
  // blend.setAttribute("mode", "lighten");
  blend.setAttribute("mode", "multiply");
  blend.setAttribute("in", "blurred");
  blend.setAttribute("in2", "hmap");

  const morph = document.createElementNS(
    "http://www.w3.org/2000/svg",
    "feMorphology"
  );
  morph.setAttribute("operator", "dilate");
  morph.setAttribute("radius", tileSize / 2);

  pixelate.setAttribute("width", canvas.width);
  pixelate.setAttribute("height", canvas.height);
  pixelate.appendChild(blur);
  pixelate.appendChild(hmap);
  pixelate.appendChild(blend);
  pixelate.appendChild(morph);
}
  1. 页面加载/视口调整大小调用后
pixelate(5, 1); // 5 = tileSize, 1 = std deviation gaussian blur
  1. 添加CSS。提示:请勿使用display: none;隐藏 svg,因为它会在 Firefox 中损坏
html {
  filter: url(#pixelate);
}

svg {
  position: absolute;
  height: 0;
}

选项 3:覆盖画布

计算工作量:每次 DOM 更改

如果没有可行的示例,我就会这样做:

  1. 将页面渲染到 DOM

  2. 将页面渲染到画布(请参阅 html2canvas:http://html2canvas.hertzen.com http://html2canvas.hertzen.com或者更好的 rasterizeHTML:https://github.com/cburgmer/rasterizeHTML.js https://github.com/cburgmer/rasterizeHTML.js)

  3. 覆盖画布position: absolute; left: 0; top: 0; width: 100%; z-index: 100;

  4. 不要捕捉画布上的点击,以便下面渲染的 DOM 上的按钮/链接将起作用pointer-events: none;

  5. 缩放画布而不进行图像平滑(请参见此处:如何使用canvas和javascript对图像进行像素化 https://stackoverflow.com/questions/19129644/how-to-pixelate-an-image-with-canvas-and-javascript)

尝试阻止动态重新渲染以获得最佳性能。

选项 4:WebGL 着色器

计算量:每帧

迄今为止最酷的方法是通过 WebGL 渲染您的网站并使用着色器来创建所需的效果。

  • 您可以扩展选项 3,渲染全尺寸画布(请记住为视网膜设备渲染双倍尺寸),获取 WebGl 上下文并附加着色器
  • 或者,您可以使用 HTML GL (http://htmlgl.com/ http://htmlgl.com/)。我不会推荐它,因为它似乎没有维护,也不支持视网膜设备(=>因此一切都会模糊)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

像素化整个网页 的相关文章

  • Chrome 不渲染
    标签,FF 渲染

    我有一个非常烦人的问题 我的网站有一个表单 可以在 Firefox 中运行 但不能在 IE 或 Chrome 中运行 它是用 WordPress 的 Gravity Forms 制作的 但这可能与该问题无关 因为另一个表单插件也出现了同样的
  • 为什么这个div的计算高度比它的内容高?

    我是一名 CSS 新手 正在使用 WordPress 网站菜单栏插件 http wordpress org extend plugins menubar 用于导航 我已经能够对 CSS 的配色方案 居中和字体内容进行更改 但我无法弄清楚为什
  • 如何使用 Angular 2 实现拖放(v2.0.0-beta.15)

    我想以角度实现一个简单的拖放列表 例如我可以更改其顺序的杂货列表 iv 在使用之前实现它https github com akserg ng2 dnd https github com akserg ng2 dnd但我的问题是我使用角度2
  • 我可以在一个变量中拥有多个值吗?

    正如标题 我可以在一个变量中拥有多个值吗 首先 我有这个表格
  • CSS:仅背景不透明度,而不是内部文本[重复]

    这个问题在这里已经有答案了 我有这个注册表框 我真的很喜欢背景如何变得不透明 透明为 25 85 但后来我注意到文本和表单元素也变暗了一点 所以我想知道如何做到这一点只有边框和背景而不是盒子里面的东西 regForm z index 11
  • IE8/9 - CSS 文件的最大字节数

    我目前正在开发的应用程序有过多的 CSS 样式 我们似乎已经达到了 IE8 9 以及它可以加载的 CSS 数量的某种限制 在某些时候 它会停止解释 CSS 从而破坏某些页面上的样式 我们正在使用 Combres 来压缩 缩小导致 CSS 文
  • 在占位符中添加 HTML

    我喜欢使用 HTML 占位符 因为它有助于向用户描述他们需要输入的内容类型 但是 有时您需要为用户提供更多信息 而不仅仅是简单的句子 基本上我希望能够在我的文本区域占位符中添加换行符 制表符等 我听说过使用特殊编码来做到这一点 并且已经使用
  • 未使用 Font Family Open Sans

    我在用谷歌的 Open Sans 字体 http www google com fonts UsePlace use Collection Open Sans在我的应用程序中 我已经按照指示定义了样式表 然后我在主体选择器上使用它 body
  • Twitter Bootstrap 按钮的水平和垂直分离

    是什么导致 Twitter Bootstrap 的按钮水平分离 我在 CSS 代码中找不到它 我试图对垂直方向重复相同的操作 但似乎我未能实现这一目标 如何在按钮之间添加垂直分隔 仅当它们垂直堆叠时 第二张图片 但当它们不是 第一张图片 时
  • 复制 Chrome 默认输入的轮廓样式

    如何设置默认 Chrome 输入的轮廓样式 焦点上为橙色 使其在每个浏览器中看起来都相同 Chrome 风格似乎是textarea focus outline rgb 229 151 0 auto 5px outline offset 2p
  • 在 HTML TextArea 中设置(或读取)光标/插入符的值

    我正在尝试 但失败了 在 HTML 文本区域中实现拖放机制 使用 jQuery 或 Scriptaculous 我们都使用 拖放机制相对容易 因此我愿意接受使用这两者之一的答案 问题是 我似乎找不到读取或设置插入点的方法 我最终想要做的是确
  • 使用 jQuery 的 .trigger('dragstart') 实现 HTML5 的拖放功能时如何 .setData/.getData

    当使用 jQuery 的 trigger dragstart 在具有 ondragstart drag event 属性的元素上触发函数时 如何使用 setData getData 实现 HTML5 在触摸设备上的拖放 流程示例 用户通过
  • 等待动态加载脚本

    在我的页面正文中 我需要插入以下代码作为 AJAX 调用的结果 p Loading jQuery p p Using jQuery p 我不能使用 load 由于文档已经加载 因此该事件不会触发 这安全吗 如果没有 我如何确保在执行自定义生
  • 在java中将DataURL图像转换为图像文件

    我在我的 java servlet 中接收图像 DataURL 它看起来像 data image jpeg base64 9j 4AAQSkZJRgABAQAAAQABAA 我需要将其另存为图像文件 我该怎么做 The simplest w
  • 有没有一种方法可以使页面布局在 100% 缩放下完美契合,同时又尊重更大的缩放系数?

    有多种方法可以布局网页 使其适合浏览器视口 DOMwindow 当我说 适合 时 我包括更改所用字体的大小 更改 DIV IMG 和其他渲染元素的宽度和高度 以及允许元素 流畅 移动 目标是使页面在所有显示设备 从小型手机到大桌面屏幕 上看
  • 将压缩的json数据存储在本地存储中

    我想将 JSON 数据存储在本地存储中 有时存储的数据可能超过 5MB 每个域的浏览器允许的最大阈值 无论如何 我可以压缩或压缩数据并将其存储在本地存储中吗 如果对大数据进行每个 JS 函数的压缩和解压 会增加多少延迟 我正在使用这个 js
  • html5 vs flash - 完整的比较图表在哪里? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 因此 自从史蒂夫 乔布斯说 Flash 很糟糕并暗示 HTML5 可以完成 Flash 可以做的所有事情
  • Chrome 上的 contenteditable 中未显示编辑光标

    当您打开此页面时 请参阅现场演示 http jsfiddle net gs3p1a6r 3 show 与 Chrome span span CSS myspan border 0 outline 0 JS myspan focus the
  • CSS交付优化:如何推迟CSS加载?

    我在尝试着优化 CSS 交付遵循针对开发人员的谷歌文档https developers google com speed docs insights OptimizeCSSDelivery example https developers
  • HTML标题属性样式[重复]

    这个问题在这里已经有答案了 如何在不使用 javascript 或 CSS 的情况下更改以下标记中标题属性的样式 因为我将 HTML 插入到原本无法编辑的文档中的特定位置 span title This is information Thi

随机推荐

  • PHP cURL:修改/覆盖连接标头

    使用 PHP cURL 库 我可以操作 HTTP 标头 但是怎么样 联系标题 当我发送任何请求时 cURL 总是将其附加连接 保持活动状态当我尝试将此标头修改为这个标头时连接 保持活动状态 小写 keep alive 它会附加两行作为结果
  • Kafka 更新元数据失败

    我正在使用 Kafka v0 10 1 1弹簧启动 我正在尝试在 Kafka 主题中生成一条消息mobile user使用以下生产者代码 Topic mobile user有 5 个分区和 2 个复制因子 我已附上我的问题末尾的Kafka设
  • 使用 ie10 的 webbrowser c# winform

    我想强制网络浏览器在我的 c winform 应用程序中使用 IE10 我知道还有其他类似的问题 但我已经阅读了很多 但我不知道我错在哪里 这是我的代码 RegistryKey registrybrowser Registry LocalM
  • 为什么 jQuery 不使用 JSDoc? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 或者它们确实存在 但只是不在源代码中 我真的很想得到一些东西 可以阻止 js doc toolkit 每次解析 jQuery 时崩溃 这也意味着
  • 如何将 XML 发布到 MVC 控制器中? (而不是键/值)

    使用 Fiddler 我可以传入 body someXml ThisShouldBeXml 然后在控制器中 HttpPost public ActionResult Test object someXml return Json someX
  • C++ 中的可扩展自动类注册

    C 中的自动类注册是一项常见任务 也是 StackOverflow 上的一个常见问题 在对象工厂中注册对象创建者 https stackoverflow com questions 1310214 register an object cr
  • 如何在 app.config 文件中定义端点?

    如何在 app config 文件中使用 MEX 端点定义端点以及运行应用程序所需的内容 我有一个名为 IXMLService 的服务合同 并且我正在使用 WsHttpBinding 请举个例子 创建app config后 如何启动服务
  • 将一个 Div 插入到另一个 Div 中?

    我正在创建一个网络应用程序 想知道为什么以下代码不起作用 它首先创建一个元素 然后将其添加到主体中 然后 我创建另一个 Div 元素 我想将其放置在我创建的第一个 div 元素内 我使用 MooTools 类来创建和初始化对象 它工作正常
  • 挑战:ViewPager 的自定义动画。更改所选元素的高度(视图折叠)

    我目前正在研究 ViewPager 中切换页面之间的自定义动画 当我向左滑动时 视图向左移动 新视图从其下方来到前面 我想让视图向左移动 我处理的 以缩小 如下图所示 在第二张和第三张图片中 我没有想象新的视图出现在前面 但我认为这是没有必
  • 将 vsDoc 更新到 1.5 会破坏所有 JavaScript

    我在看似最简单的操作上遇到了一些困难 在 Visual Studio 中 当我将 vsDoc 从 1 4 1 更改为 1 5 时 页面上的 JavaScript 不再起作用 视觉工作室 2010 原来的 有效的 是这样的
  • 不可知地检查 unittest.mock 调用参数。它们是否作为位置参数或关键字参数传递

    When a unittest mock Mock对象已被调用 我可以使用调用的确切签名检查参数值 from unittest mock import Mock m Mock creation of mock m foo bar baz c
  • XNA C# 2D 平台游戏

    我正在尝试在 XNA 中制作 弄清楚如何 一个 2d 平台游戏 我知道如何创建平铺网格以及如何执行碰撞检测 我对玩家的 9 个边界图块执行碰撞检测 但我想知道是否有更好的方法来执行碰撞检测 我读过 时空幻境 不使用图块 而是使用拼凑的图像或
  • 当名称可以是任何语言时,如何按名称索引 postgres 表?

    我有一个很大的 postgres 表 其中包含位置 商店 地标等 用户可以通过各种方式进行搜索 当用户想要搜索某个地点的名称时 系统当前会执行以下操作 假设搜索是在咖啡馆 lower location name LIKE cafe 作为查询
  • 在css中为文件上传按钮添加样式

    我有一个带有以下 css 的文本字段和按钮 JS 小提琴链接 http jsfiddle net Tdkre http jsfiddle net Tdkre submit moz box shadow inset 0px 1px 0px 0
  • 如何防止删除Android中编辑文本的第一个字符

    这是我在应用程序中编辑文本之一
  • 如何迭代 C# 中的内置类型?

    我想迭代 C 中的内置类型 bool char sbyte byte short ushort 等 怎么做 foreach var x in GetBuiltInTypes do something on x 系统类型代码 http msd
  • 我们可以访问不存在的工会的成员吗?

    在 C 标准中 基本 lval 11 6 http eel is c draft basic lval 11 6 says 如果程序尝试通过以下类型之一以外的泛左值访问对象的存储值 则行为未定义 聚合或联合类型 其元素或非静态数据成员中包含
  • 如何重载Python中的内置模块?

    我正在尝试将主机绑定到我的 python 程序中的指定 ip 只是让它在python程序中起作用 所以我不打算修改 etc hosts file 我尝试添加一些代码create connection函数于socket py对于主机 IP 转
  • 将逻辑放入 SQL 中的优点和缺点? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在一份新工作中 我刚刚接触到将逻辑放入 SQL 语句的概念 在 MySQL 中 一个愚蠢的例子是这样的 SELECT P LastName IF
  • 像素化整个网页

    我了解如何缩放小画布以制作具有厚实而不是模糊像素的大画布 有什么方法可以让整个网页显示为厚实的 2x2 或 3x3 像素吗 即用最近邻缩放来放大它 我想使用普通 HTML 但将其像素化以获得仿 8 位外观 很酷的主意 我想如果你不关心性能的