【问题标题】:Make JPG white background transparent使JPG白色背景透明
【发布时间】:2013-04-03 01:45:37
【问题描述】:

我正在加载一些图像,我想从 PNG 转换为 JPG 以具有更小的文件大小。然而,由于 JPG 没有透明度信息,因此图像的背景显示为白色。

加载图片后如何使这个白色背景透明?

提前致谢

【问题讨论】:

  • 只是将所有白色像素设置为在您的代码中透明?不过我不推荐使用白色。
  • 重复问题? stackoverflow.com/q/12598912/2266191JPEG 不允许透明度。
  • 您应该坚持使用 Flash 中的 PNG。实际上,Flash 渲染 PNG 比 JPG 更快(这听起来很奇怪,因为 PNG 有一个额外的通道,但这是 Adob​​e 过去所说的)​​
  • Flash 还可以比 JPG 更好/更多地压缩 png,从而减小文件大小。
  • 如果你的 png 有那么大,也许你做错了什么。例如,您是否尝试在不导出的情况下使用 Fireworks 原生 png?

标签: actionscript-3 flash transparency


【解决方案1】:

JPG(技术上,JPEG 文件交换格式)文件,正如普通浏览器和图形应用程序所理解的那样,不支持像 PNG 那样在图像中存储 alpha 通道。根据您的应用程序,您可能希望存储一个单独的黑白“图像”文件,它是 JPG 的透明蒙版,并使用该对。可以在自定义软件中使用格式的扩展,但它们不会在其他地方被理解。

但首先,请确保 JPG 确实是您想要使用的。 JPG 仅适用于“摄影”图像,这些图像通常没有透明蒙版(当然也有例外)。如果图像更像 Icon/Drawing,那么 JPG 很可能不会比 PNG 小很多,并且具有难看的锯齿伪影,因此仅优化 PNG 会得到更好的结果。

【讨论】:

  • 虽然 JPEG 文件格式的技术描述是准确的,但一旦导入的资源在库中,其原始文件格式与是否可以在 Flash 中进行像素级操作无关。 OP想要做的结果不太可能是好的,因为他们可能想要透明的许多像素不会是0xFFFFFF,但这并不意味着它不能完成。
  • 是的,他想要做的事情可能还有一些其他的变通方法:例如,减少原始图像的动态范围,使其没有白色,然后将全白色视为透明。但是正如您所指出的,许多精确的像素值无法在 DCT 中幸存下来,因此透明区域中会有一些几乎是白色的斑点,并且图像中可能会有一些小孔。 JPG 只是不适合这项工作的工具。因此,我建议要么坚持使用 PNG,要么只为蒙版使用单独的 PNG。
【解决方案2】:

我假设您想在运行时将白色像素更改为透明像素。首先,我只想说最好的答案,就是使用 PNG 格式。我的观点是在运行时做这样的事情不是一个好的解决方案。如果您有很多图像,文件大小很重要,那么运行时处理会带来它自己的负面影响,即处理图像时的长时间停顿。

我个人会探索我可以做些什么来减小 PNG 文件的大小,并且可能永远不会使用这样的解决方案。

但是,如果你选择走这条路,你需要做的是:

  • 将图像转换为带有 Alpha 通道的 BitmapData。

  • 循环通过 BitmapData 并使这些像素透明。

  • 使用 BitmapData 的threshold() 方法。

正如您在 cmets 中提到的那样,使用白色作为背景颜色并不是一个好主意,因为所有白色像素都将变为透明,而不仅仅是背景像素。

因此,选择这些图像的调色板中没有的颜色是您想要用作背景颜色的颜色

正如评论者所说,BitmapData 的threshold() 方法可能效果最好。

【讨论】:

  • threshold() 不是更好吗?请注意,创建 BitmapData 时需要具备透明性才能使其正常工作。
  • 如果您注意到第一个要点,它指定创建一个带有 Alpha 通道的 BitmapData。是的,阈值也可以。
【解决方案3】:

您可能需要考虑将 png 嵌入 Flash 库中,然后导出为 swf。然后,您可以使用 Flash 使用有损 JPEG 算法压缩您的 png,但它仍会保留 alpha 通道。这可能会导致文件大小更小,但有利于保持 8 位 Alpha 通道(每个像素有 256 个透明度级别)。

通过屏蔽特定颜色,您只会得到一个 1 位的 Alpha 蒙版(一个像素要么完全可见,要么完全隐藏。)您还可能遇到问题,例如图像中的颜色与遮罩对应时颜色,从您要显示的实际图像中删除像素。

在 JPEG 图像中使用哑光颜色的另一个问题是 JPEG 压缩会留下伪影,尤其是在对象边缘和哑光颜色周围。这使得很难正确掩盖特定颜色。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 2015-06-22
    • 1970-01-01
    • 2012-10-05
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    相关资源
    最近更新 更多