当前位置:  开发笔记 > 编程语言 > 正文

将alpha值添加到双线性调整大小算法

如何解决《将alpha值添加到双线性调整大小算法》经验,为你挑选了1个好方法。

所以我试图采用双线性插值算法来调整图像大小并添加alpha值.我正在使用Actionscript 3来做到这一点,但我并不认为这种语言是相关的.

我下面的代码实际上工作得很好,但"擦除"区域周围的边缘似乎变得更暗.有没有一种简单的方法可以让它在找到平均值时不包含我只能假设的黑色(0x00000000)?

码:

x_ratio = theX - x;
y_ratio = theY - y;
x_opposite = 1 - x_ratio;
y_opposite = 1 - y_ratio;

a = getPixel32(x, y);
be =getPixel32(x + 1, y);
c = getPixel32(x, y + 1);
d = getPixel32(x + 1, y + 1);
alph    = (t(a)  * x_opposite  + t(be)   * x_ratio) * y_opposite + (t(c) * x_opposite  + t(d) * x_ratio) * y_ratio;
red     = (r(a)  * x_opposite  + r(be)   * x_ratio) * y_opposite + (r(c) * x_opposite  + r(d) * x_ratio) * y_ratio;
green   = (g(a)  * x_opposite  + g(be)   * x_ratio) * y_opposite + (g(c) * x_opposite  + g(d) * x_ratio) * y_ratio;
blue    = (b(a)  * x_opposite  + b(be)   * x_ratio) * y_opposite + (b(c) * x_opposite  + b(d) * x_ratio) * y_ratio;

效果图:http://beta.shinyhammer.com/images/site/eraser_pixelborders.jpg

发布解决方案代码!

a = getPixel32(x, y);
be =getPixel32(x + 1, y);
c = getPixel32(x, y + 1);
d = getPixel32(x + 1, y + 1);
asum = (t(a) + t(be) + t(c) + t(d)) / 4;

alph    = (t(a)  * x_opposite  + t(be)   * x_ratio) * y_opposite + (t(c) * x_opposite  + t(d) * x_ratio) * y_ratio;
red     = ((r(a) * t(a) * x_opposite  + r(be) * t(be) * x_ratio) * y_opposite + (r(c) * t(c) * x_opposite  + r(d) * t(d) * x_ratio) * y_ratio);
red = (asum > 0) ? red / asum : 0;
green   = ((g(a) * t(a) * x_opposite  + g(be) * t(be) * x_ratio) * y_opposite + (g(c) * t(c) * x_opposite  + g(d) * t(d) * x_ratio) * y_ratio);
green = (asum > 0) ? green /  asum : 0;
blue    = ((b(a) * t(a) * x_opposite  + b(be) * t(be) * x_ratio) * y_opposite + (b(c) * t(c) * x_opposite  + b(d) * t(d) * x_ratio) * y_ratio);
blue = (asum > 0) ? blue / asum : 0;

Mark Ransom.. 5

在使用它们之前,需要将每个r,g,b值乘以相应的alpha值,然后在完成后将值除以最终的alpha值.很容易想象当其中一个像素的alpha值为零时,这将产生的影响 - 每个r,g,b值都将乘以零,因此它们的原始值根本不重要!他们不会为最终结果做出贡献.

您需要添加一个检查,以便您永远不会除以零,并确保舍入错误不会使您的最终值超过上限.

通常,图像将存储在内存中,而alpha已经乘以r,g,b值 - 这称为预乘alpha(维基百科参考).



1> Mark Ransom..:

在使用它们之前,需要将每个r,g,b值乘以相应的alpha值,然后在完成后将值除以最终的alpha值.很容易想象当其中一个像素的alpha值为零时,这将产生的影响 - 每个r,g,b值都将乘以零,因此它们的原始值根本不重要!他们不会为最终结果做出贡献.

您需要添加一个检查,以便您永远不会除以零,并确保舍入错误不会使您的最终值超过上限.

通常,图像将存储在内存中,而alpha已经乘以r,g,b值 - 这称为预乘alpha(维基百科参考).

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有