当前位置: 首页 > 知识库问答 >
问题:

将画布导出为不带透明度的PNG(alpha通道)

姜博
2023-03-14

**编辑**我必须导出一个大画布(5Mo

当我导出我的画布(使用toDataUrl)时,它总是返回一个带有alpha通道的. png文件的bas64表示。阿尔法通道权重约为图像数据的25%,我不需要它。

建议的答复:

  1. PNG压缩是好的。如果alpha通道是平坦的(所有值都相同),则不会占用太多空间。即使使用完全不透明的alpha通道,也会显示(压缩)。png文件更大。(在一些测试中约为10%)

有没有办法将我的画布导出为. png,但没有alpha通道?如果"否",是否有一种方法(lib)在javascript修剪alpha通道?导出为. jpeg不是一个解决方案,我需要一个. png文件。

谢谢!:)

共有3个答案

荣俊
2023-03-14

在画布上绘图之前,应该先填充画布(使用您想要的背景颜色)。

例如,以前:

var ctx = canvas.getContext('2d');
drawEverythingOnMyContext(ctx);
image = canvas.toDataURL();

之后:

var ctx = canvas.getContext('2d');
// draw a background
ctx.fillStyle = 'white';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// draw then
drawEverythingOnMyContext(ctx);
image = canvas.toDataURL();
百里成仁
2023-03-14

我的目标和你的相似:导出PNG格式的画布,并在将其发送到服务器之前从其数据URL表示中删除alpha通道信息。然而,我的理由和你的不同。我想在另一端将结果图像文件合并为PDF,我使用的img2pdf库无法处理alpha通道信息。我为画布使用的库fabric.js,但是通过toDataUrl()导出任何HTML5画布时都会出现问题。

幸运的是,有一个很好的javascript库,名为pngjs,它可以在javascript中操作PNG文件。它附带异步和同步例程。这就是我如何将DataURL从Alpha转换为非Alpha。您的第3步(博客的数据URL)应该足以完成这项工作。

let PNG = require('pngjs').PNG;

/* thehref: DataURL form of a png file. */
function removeAlphaFromDataUrl(thehref) {
  let dataurlstring = "data:image/png;base64,"
  let buff = new Buffer(thehref.slice(22), 'base64')
  let png = PNG.sync.read(buff);
  let options = { colorType: 2 };
  let buffer = PNG.sync.write(png, options);
  let output = buffer.toString('base64');
  let newhref = dataurlstring + output
  return newhref;
}
益楷
2023-03-14

PNG压缩是好的。如果alpha通道是平坦的(所有值都相同),则不会占用太多空间。

您可以使用复合操作“destination over”填充透明和半透明像素。

以下函数将所有像素的alpha值设置为1。

function fillAlpha(ctx, bgColor){  // bgColor is a valid CSS color ctx is 2d context
   // save state
   ctx.save();
   // make sure defaults are set
   ctx.globalAlpha = 1;
   ctx.setTransform(1, 0, 0, 1, 0, 0);
   ctx.filter = "none";

   // fill transparent pixels with bgColor
   ctx.globalCompositeOperation = "destination-over";
   ctx.fillStyle = bgColor;
   ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);

   // cleanup
   ctx.restore();
}

然后,您可以将图像保存为PNG,阿尔法通道尽可能小。

 类似资料:
  • 问题内容: 是否可以设置和获取布局的Alpha /不透明度及其所有子视图?我不是在说背景。在相对布局中说出视频控件的集合,例如播放,暂停和进度条。 我可以使用动画淡入淡出,但想知道是否可以使用直接方法。 问题答案: 您可以使用持续时间为0的AlphaAnimation和setFillAfter选项在布局及其子级(或其他任何视图)上设置Alpha。 例: 您可以将一个动画用于多个组件以节​​省内存。

  • 我有一个包含透明图标(32位,带alpha通道)的。我想做的是将基于图像索引的单个图标保存为PNG文件,同时保留alpha通道的透明度。使用RAD Studio 2010,因此它具有支持,不需要第三方库。图像从PNG“精灵”图像中加载到TImageList中,使用这里的方法——在运行时使用Delphi XE将png图像添加到图像列表中——因此加载时保留透明度。现在我需要单独保存它们,换句话说,从已

  • 问题内容: 嘿,当我从png创建缩略图时,尝试保持png的透明度时遇到麻烦,有人对此有任何经验吗?任何帮助都会很棒,这是我目前正在做的事情: 问题答案: 过去,我已经成功地做到了: 我发现输出图像使用质量更好的比

  • 我正试图重新设计我的网站,使我原来的方形、基于瓷砖的图像渲染更像是图像的剪贴画。。。为了摆脱网格模式。 这是它最初的样子。。。 这是我想要的一个粗略的模型: 所以我重新保存了一个透明背景的图像缩略图。。。我只想让狗展示,正方形是透明的,可以在下面显示网站的背景。 然而,当我在页面上呈现它时,它的背景是黑色的。 我已经检查了我的CSS,看看是否有某种img类,或用于渲染漫画的类。。。甚至可以通过引导

  • 问题内容: 我已经实现了[waypoints][1]插件,当对象的像素高于100px时,该对象就会褪色。[使用offet属性],但希望基本上控制对象的不透明度并使动画可见,如上面的示例。 我已经搜寻了全部-这是我的最后选择。任何帮助是极大的赞赏。 问题答案: 我在这里复制粘贴基本代码

  • 问题内容: 我正在使用以下代码读取PNG图片: 在显示时,有一个黑色背景,我知道是由PNG透明性引起的。 我找到了建议使用的解决方案,但是我不确定如何将其应用于上面的代码。 问题答案: 创建第二个类型… 将原件涂到副本上… 您现在有了图像的非透明版本… 要保存图像,请看写/保存图像