Surface.blit在1.8中有一个新参数:blend.定义了以下值:
BLEND_ADDBLEND_SUBBLEND_MULTBLEND_MINBLEND_MAXBLEND_RGBA_ADDBLEND_RGBA_SUBBLEND_RGBA_MULTBLEND_RGBA_MINBLEND_RGBA_MAXBLEND_RGB_ADDBLEND_RGB_SUBBLEND_RGB_MULTBLEND_RGB_MINBLEND_RGB_MAX有人可以解释这些模式的含义吗?
可能重复:
如何快速进行alpha混合?
alpha混合2种RGBA(整数)颜色的最快方法是什么?
作为注释,目标颜色混合的位置始终是不透明的,只有第二种颜色可以具有不同的透明度.
我试图在C中找到最快的方法,考虑到混合的最终结果颜色必须最终没有透明度,完全不透明(alpha = 0xff)
我想在拖放操作中使用部分透明的图像.这一切都已设置并且工作正常,但实际转换为透明度有一个奇怪的副作用.出于某种原因,像素似乎与黑色背景混合.
下图描述了该问题:

图a)是原始位图.
图b)是在执行α混合之后产生的.显然,这比预期的50%α滤镜要暗很多.
图c)是所需的效果,图像a)具有50%的透明度(用绘图程序添加到组合物中).
我用来生成trasparent图像的代码如下:
Bitmap bmpNew = new Bitmap(bmpOriginal.Width, bmpOriginal.Height);
Graphics g = Graphics.FromImage(bmpNew);
// Making the bitmap 50% transparent:
float[][] ptsArray ={
new float[] {1, 0, 0, 0, 0}, // Red
new float[] {0, 1, 0, 0, 0}, // Green
new float[] {0, 0, 1, 0, 0}, // Blue
new float[] {0, 0, 0, 0.5f, 0}, // Alpha
new float[] {0, 0, 0, 0, 1} // Brightness
};
ColorMatrix clrMatrix = new ColorMatrix(ptsArray);
ImageAttributes imgAttributes = new …Run Code Online (Sandbox Code Playgroud) 我正试图在SASS中实现PDF规范中的混合模式,这是我自己的乐趣.
PDF规范:http: //www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf
页面322是alpha合成部分.
输入值是RGBA格式,但现在我正在尝试实现alpha组件的混合.我怎么兴奋地去做呢?根据我的收集,我的值应该介于0.0和1.0之间,这已经完成了.但是根据规格,您似乎应该为每个颜色通道进行混合?我是否只是将其平均以回到我的alpha组件的RGBA表单?
任何帮助是适当的,我不介意阅读博客,书籍等来得到我的答案,因为这纯粹是一个智力练习.
提前致谢,
埃米尔
我经常用OpenGL找到,当我试图在纹理上绘制一些东西然后再到另一个表面上时,使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),我总是最终得到一个彩色光环(通常是一个深色的带),在我的源的半透明部分边缘附近的图像.这显然是由于制作本质上是由该混合风格引起的预乘alpha的问题引起的.对于3D场景,我通常使用画家算法,并且为了渲染2D内容,我喜欢先绘制最后面的对象,然后在它们之上覆盖其他对象.值得注意的是,在进行这样的2D绘制时,我通常不能像3d中那样依赖像az缓冲区这样的功能,这就是为什么渲染像guis这样的东西比3D场景图更多的问题.
我认为值得注意的是,当目标缓冲区恰好已完全不透明时,上述混合风格实际上是完美的,但如果目标是透明的,那么在这种情况下实际需要的是glBlendFunc(GL_SRC,GL_ZERO)......因为任何全白像素例如,在源中部分透明,应该保持完全饱和的颜色,而不是与实际上不存在的背景"混合",因为使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)实际上会渲染部分透明和全白像素前景和背景之间的混合,这是我想要的,但不是alpha信息丢失的程度,也不是实际改变颜色的程度.
因此,在我看来,那种可能完美的混合函数实际上会混合在原本由其自身价值引起的glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)和由此引起的内容之间.glBlendFunc(GL_SRC,GL_ZERO)DST_ALPHA
因此,理想情况下:
Cr = Cs * (1 - Ad) + (Cs * As + Cd * (1 - As)) * Ad
Ar = As * (1 - Ad) + Ad * Ad
Run Code Online (Sandbox Code Playgroud)
这样,如果目的地已经是不透明的,则正常的阿尔法乘法适当地混合,而如果目的地是透明的或部分透明的,它将使用更多的源图像的真实颜色而不是使用所述颜色的阿尔法预乘形式.
然而,似乎没有明显的方法来描述这种混合机制到OpenGL.似乎这些问题在我的情况下几乎不应该是独一无二的,而且对我来说似乎并不常见,即使在可编程管道中也没有任何方法可以实现这一点.
到目前为止,我发现的唯一解决方法是每当我绘制一个纹理时反转绘图顺序,我将在其他地方绘制并使用glBlendFuncSeparate(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA).
在我将在以后正常渲染的纹理上绘制某些东西的情况下绘制顺序的特殊情况是一种妥协,但这对我来说没有吸引力,因为它缺乏可重用性,除非执行绘图的代码总是让人知道什么类型的目的地,以便它可以扭转自己通常的绘图顺序,我可以毫不必要地使它复杂化.
最后,尽管反转整个场景的绘制顺序并不一定完全不可能,但它要求在绘制第一个对象之前确定将在每个图形帧中显示的完整对象列表.我对此有一个核心问题是虽然在渲染3D场景时这可能是可持续的,但在绘制像2d gui这样的东西时,绘制的各种各样的东西以及绘制它们的方式都是如此之大以至于没有将它们概括为单个对象列表的方法,该列表总是可以在以后以相反的顺序遍历.在我看来,它需要这样一个根本不同的观点,如何按照我习以为常的"倒退"顺序构建2D场景,我现在根本无法理解可维护的解决方案.
那么......有另一种方法吗?我错过了什么吗?或者我是否必须学习一种完全不同的方式来构建2D图像?我不可能是唯一有这个问题的人,但我还没有找到任何好的和干净的解决方案.
编辑:
如果确实存在OpenGL的任何常用扩展,通过NVIDIA或其他方式,允许混合模式可以执行此操作:
Cr = Cs * (1 - Ad) + (Cs * As + Cd * (1 - As)) * Ad …Run Code Online (Sandbox Code Playgroud) 我正在使用OpenGL绘制2D.我正在尝试用alpha覆盖纹理.我这样做了:
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
Run Code Online (Sandbox Code Playgroud)
然后我以反向z顺序绘制.但是,我变得奇怪的变色.这是一个应该从一个图像平滑淡入到另一个图像的例子(事实上,在这种特殊情况下图像是无缝的,但这并不总是会发生(所以,不,我不能只有alpha)):

看到中间的灰色斑块?该补丁既不在源PNG中.有谁知道造成这种情况的原因以及如何解决这个问题?也许完全不同的alpha策略?
编辑:作为参考,这里是混合的两个纹理:

我想创建一个更改alpha值的简单动画:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2];
[view1 setAlpha:0.00];
[UIView commitAnimations];
Run Code Online (Sandbox Code Playgroud)
好的,这样我将alpha值更改为两秒并且它工作正常,但我想要这样的事情:当alpha为0时,动画必须再次开始alpha = 1所以动画应该是:alpha 0 - > alpha 1 - > alpha 0 - > alpha 1 - > ...依此类推,持续时间为2秒.你能帮助我吗?
我的完整代码是
-(IBAction){
FirstViewController *firstViewController = [[[FirstViewController alloc] init]autorelease];
[firstViewController.label1 setAlpha:1.00];
[firstViewController.label2 setAlpha:1.00];
view = firstViewController.viewFirst; //this is my view and I copy in other view
[self fadeOut:nil finished:nil context:nil];}
- (void) fadeOut:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(fadeIn:finished:context:) ];
[view setAlpha:0.00];
[UIView …Run Code Online (Sandbox Code Playgroud) 我希望我的按钮上有alphablending图像.
按照指示,我TXPManifest在我的mainform中包含了一个组件.
下面是我加载到项目中的一些图像.

然而,我BitBtn通过ActionList链接到图像列表仍然看起来.
<< - 在运行时看起来像这样,Yikes!
如何在我的Windows 7笔记本电脑上运行Delphi 2007来实际使用ImageList不断取笑我的alpha通道?
为响应@RRUZ,以下是imagelist属性:

(注意没有colordepth财产)
编辑
alpha混合确实与TMS一起使用AdvGlowButton:
因此它可能不是ImageList问题,因为它是BitBtn问题.
更新2
下载并安装PngComponents.把一个TPNGImageList空白表格上瞬间崩溃D2007.(也许在设置/路径/等等中,但我离原始问题太远了,所以我放弃了png追求).
所以这不起作用.
我正在尝试为 CSS 实现穷人的混合模式,期待浏览器推出支持。(我使用的 CSS 预处理器是 Stylus,这对讨论并不重要。)我从 W3C SVG 规范中找到了混合模式计算的来源,但某些方程给出的结果与预期的结果大不相同 -具体来说,hard-light、soft-light、color-dodge和color-burn。
有谁知道有关混合模式的更正确、更可靠的公式?我将每种颜色的 RGB 通道预乘以它们的 Alpha。
这是我到目前为止所得到的。 https://github.com/pdaoust/stylus-helpers/blob/master/blend.styl
我在页面上设置了一个 webgl 画布,并在启动时使用了这些参数:
gl = canvas.getContext("webgl", {
alpha: true,
premultipliedAlpha: false
});
Run Code Online (Sandbox Code Playgroud)
然后我做了所有的设置工作来制作一个程序、一个顶点着色器和一个片段着色器。
我的顶点着色器只给我一个 2d 绘图表面,我的片段着色器如下所示:
void main(void) {
gl_FragColor = vec4(1.0, 1.0, 1.0, 0.1);
}
Run Code Online (Sandbox Code Playgroud)
所以基本上我想做的就是在页面上绘制一个透明的白色框。这适用于我测试过的所有浏览器,除了 safari/ios。在 safari 中,盒子是全白色的,看不到透明度。
这是蓝色页面背景的并排屏幕截图:
我是否应该设置其他参数才能使其正常工作?或者ios与其他浏览器有不同的行为吗?
更新:如果我在调用片段着色器后运行清除颜色命令(意味着着色器输出被擦除并替换为清除颜色),则 webgl 画布是透明的。
gl.clearColor(0.0, 0.0, 0.0, 0.1);
gl.clear(gl.COLOR_BUFFER_BIT);
Run Code Online (Sandbox Code Playgroud)
然而,除了制作纯色半透明颜色之外,这并不能让我做太多事情。我希望在片段着色器本身中实现可变透明度。