我使用此代码将背景设置为模式图像:
UIImage *bg = SomeImage();
UIColor *bgc = [UIColor colorWithPatternImage:bg];
[self setBackgroundColor:bgc];
[self setOpaque:NO];
Run Code Online (Sandbox Code Playgroud)
这有效,但alpha混合不起作用.可能是一个bug.如何使它工作?
iOS SDK 4.1我正在使用Three JS将视频纹理混合到画布上.
我试图让它成为视频纹理的背景是透明的,但最终发生的事情是视频只在某些计算机上透明而不是全部.
下面是计算机上的外观截图,它没有显示为透明.(具有讽刺意味的是,如果您的计算机没有遇到此问题,这将显得透明
我想弄清楚为什么会这样.以下是我的结论:
这不依赖于浏览器,因为问题出现在不同的浏览器上.
这不依赖于操作系统.我有时在Mac上看到这个问题,有时在Windows上看到过.
这不依赖于显示器,因为我用我的QA人切换了显示器.我的QA家伙目前看到透明盒子.在我的电脑上,我没有.用我的QA人切换显示器导致我使用他的显示器但没有看到透明盒子.然而,尽管使用我的显示器,他仍然看到透明盒子.因此,它不是监视器问题.
所以问题是,这里发生了什么以及可能导致这种透明度问题的原因是什么?
JS小提琴代码
function init() {
// create container, scenes and camera
THREE.ImageUtils.crossOrigin = true;
container = document.createElement('div');
container.className = "ThreeJSCanvas";
container.id = "ThreeJSCanvas";
document.body.appendChild(container);
camera = new THREE.PerspectiveCamera(50, window.innerWidth / (window.innerHeight - 61), 1, 2000);
camera.position.z = 100;
cameraInterface = new THREE.PerspectiveCamera(50, window.innerWidth / (window.innerHeight - 61), 1, 2000);
cameraInterface.position = camera.position;
cameraInterface.position.z = 100;
sceneSprites = new THREE.Scene();
sceneSky = new THREE.Scene();
//renderer
renderer3D = new THREE.WebGLRenderer({
antialias: true,
preserveDrawingBuffer: true, …Run Code Online (Sandbox Code Playgroud) 我试图将一个框模糊应用于透明图像,并且我在边缘周围得到一个"暗晕".
Jerry Huxtable 简要提到了这个问题,并且展示了问题的一个非常好的演示:

但是,对于我的生活,我无法理解" 预乘alpha "是如何解决这个问题的.现在举一个非常简单的例子.我有一个3x3图像,包含一个红色和一个绿色像素:

实际上剩下的像素是透明的:

现在我们将对图像应用3x3 Box Blur.为简单起见,我们只计算中心像素的新值.盒子模糊的工作方式是,由于我们有一个9个位置的正方形(3x3,称为内核),我们占用内核中每个像素的1/9,并将其加起来:

所以
finalRed = 1/9 * red1 + 1/9 * red2 + 1/9 * red3+ ... + 1/9 * red9
finalGreen = 1/9*green1 + 1/9*green2 + 1/9*green3+ ... + 1/9*green9
finalBlue = 1/9* blue1 + 1/9* blue2 + 1/9* blue3+ ... + 1/9* blue9
finalAlpha = 1/9*alpha1 + 1/9*alpha2 + 1/9*alpha3+ ... + 1/9*alpha9
Run Code Online (Sandbox Code Playgroud)
在这个非常简单的例子中,计算变得非常简单:
finalRed = 1/9 * 255
finalGreen = 1/9 * 255
finalBlue = 0
finalAlpha …Run Code Online (Sandbox Code Playgroud) alphablending image-processing convolution premultiplied-alpha
下图中有3个背景:黑色白色和灰色
每个都有3个条形:黑色 - >透明,白色 - >透明,颜色 - >透明
我正在使用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 我所有的顶点颜色都是1,1,1,0.
缺陷在白色 - >透明的白色背景上非常明显.
在Windows XP(以及其他Windows风格)上,它完美运行,我完全变白了.然而,在Mac上,我在中间变灰了!
什么会导致这种情况,为什么当我在白色混合白色时会变暗?
屏幕截图的完整尺寸是@ http://dl.dropbox.com/u/9410632/mac-colorbad.png

更新信息:
在Windows上,它似乎与opengl版本无关.所有工作都是2.0到3.2.在我现在面前的Mac上,它是2.1.
渐变保持在纹理中,并且所有顶点都是彩色的1,1,1,1(白色rgb,完整的alpha).背景只是1x1像素纹理(用渐变着色),顶点根据需要着色,带有完整的alpha.
地图集是用glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, data);我自己编写的ARGB dds文件创建的.
我还应该注意,所有内容都是使用一个简单的简单着色器绘制的:
uniform sampler2D tex1;
uniform float alpha;
void main() {
gl_FragColor = gl_Color * texture2D(tex1, gl_TexCoord[0].st) * vec4(1.0, 1.0, 1.0, alpha);
}
alpha uniform设置为1.0
现在,我确实尝试改变它,所以白色渐变不是纹理,而只是4个顶点,其中左边是纯白色和不透明,右边是1,1,1,0,这是有效的!
我现在已经对纹理进行了三次检查,它只是白色,具有不同的alpha 1.0-> 0.0.
我想这可能是默认问题.opengl或驱动程序的版本可能会以不同方式初始化事物.
例如,我最近发现默认情况下每个人都有GL_TEXTURE_2D glEnabled,而不是Intel GME965.
找到解决方案
首先,多一点背景.这个程序实际上是用.NET编写的(在OS X上使用Mono),而我正在编写的DDS文件是通过将24位PNG文件的目录压缩成最小的纹理而自动生成的图集.我正在使用System.Drawing.Bitmap加载这些PNG,并在确定布局后将它们渲染为更大的Bitmap.然后锁定后布局位图(以获得它的字节),然后通过我编写的代码将其写入DDS.
在阅读Bahbar的建议后,我检查了记忆中的纹理,它们确实不同!我的DDS加载似乎是罪魁祸首,而不是任何OpenGL设置.在今天的预感中,我在两个平台上检查了DDS文件本身(使用字节进行字节比较),实际上,它们是不同的!当我使用WTV(http://developer.nvidia.com/object/windows_texture_viewer.html)加载DDS文件时,它们看起来完全相同.但是,使用WTV,您可以关闭每个频道(RGBA).当我切换掉Alpha通道时,在Windows上我看到了一个非常糟糕的图像.没有alpha会导致没有抗锯齿边缘,所以当然看起来很可怕.当我关闭OSX DDS上的alpha通道时,它看起来很好!
Mono中的PNG加载程序是预乘,导致我的所有问题.我为他们输入了一张票(https://bugzilla.novell.com/show_bug.cgi?id=679242)并直接使用了libpng.
感谢大家!
我一直试图混合两个图像.我正在采用的当前方法是,我获得两个图像的重叠区域的坐标,并且仅在重叠区域中,在添加之前,我与0.5的硬编码α混合.所以基本上我只是从两个图像的重叠区域中取出每个像素的一半值,并添加它们.这并没有给我一个完美的混合,因为alpha值被硬编码为0.5.这是混合3张图片的结果:
如您所见,从一个图像到另一个图像的转换仍然可见.如何获得可以消除这种可见过渡的完美alpha值?或者没有这样的事情,我采取了错误的做法?
这是我目前正在进行混合的方式:
for i in range(3):
base_img_warp[overlap_coords[0], overlap_coords[1], i] = base_img_warp[overlap_coords[0], overlap_coords[1],i]*0.5
next_img_warp[overlap_coords[0], overlap_coords[1], i] = next_img_warp[overlap_coords[0], overlap_coords[1],i]*0.5
final_img = cv2.add(base_img_warp, next_img_warp)
Run Code Online (Sandbox Code Playgroud)
如果有人想试一试,这里有两个扭曲的图像,以及它们重叠区域的面具:http://imgur.com/a/9pOsQ
python opencv alphablending image-processing computer-vision
我需要创建一个自定义控件来显示带alpha通道的bmp图像.背景可以用不同的颜色绘制,图像有阴影,所以我需要真正"绘制"alpha通道.
有谁知道怎么做?
我还希望尽可能使用Alpha通道信息创建一个遮罩,以了解鼠标是单击图像还是透明区域.
任何形式的帮助将不胜感激!
谢谢.
编辑(JDePedro):正如你们中的一些人所说,我一直在尝试使用alpha混合来用alpha通道绘制位图.这只是我实现的测试,我从资源加载32位位图,我尝试使用AlphaBlend函数绘制它:
void CAlphaDlg::OnPaint()
{
CClientDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP);
BITMAP BitMap;
bitmap.GetBitmap(&BitMap);
int nWidth = BitMap.bmWidth;
int nHeight = BitMap.bmHeight;
CBitmap *pOldBitmap = dcMem.SelectObject(&bitmap);
BLENDFUNCTION m_bf;
m_bf.BlendOp = AC_SRC_OVER;
m_bf.BlendFlags = 0;
m_bf.SourceConstantAlpha = 255;
m_bf.AlphaFormat = AC_SRC_ALPHA;
AlphaBlend(dc.GetSafeHdc(), 100, 100, nWidth, nHeight, dcMem.GetSafeHdc(), 0, 0,nWidth, nHeight,m_bf);
dcMem.SelectObject(pOldBitmap);
CDialog::OnPaint();
}
Run Code Online (Sandbox Code Playgroud)
这只是一个测试,所以我将代码放在对话框的OnPaint中(我也尝试了CDC对象的AlphaBlend函数).
非透明区域正在正确绘制,但我得到白色位图应该是透明的.
任何帮助???
这是截图..不容易看到,但蓝色圆圈周围有一个白色矩形: 替代文字http://img385.imageshack.us/img385/7965/alphamh8.png
好.我知道了!我必须预先乘以每个像素的alpha值.有人可以建议这样做的优化方法吗?
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混合像素.这样,我可以将位图绘制到任何颜色表面(或图像,就此而言),并且抗锯齿仍然看起来很好.
以下是显示问题的简化示例:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Bitmap bitmap = new Bitmap(this.Width, this.Height);
Graphics g = Graphics.FromImage(bitmap);
g.Clear(Color.Empty);
g.DrawString("hello world", new Font(this.Font.FontFamily, 24), Brushes.Blue, new Point(50, 50));
e.Graphics.DrawImage(bitmap, new Point(0, 0));
}
Run Code Online (Sandbox Code Playgroud)
这是结果:
alt text http://img194.imageshack.us/img194/9065/captureotd.png
最终目标是使用UpdateLayeredWindow绘制透明的alpha混合窗口.我正在创建一个类似Conky的应用程序,我希望能够使用ClearType渲染文本(当然,这很容易,没有抗锯齿).
目前,我抓住表单后面的屏幕,绘制它,然后绘制我的文本.它看起来不错,但必须更新并且绘制缓慢.在桌面上完成绘图文本的任何其他想法也将受到欢迎.
关于如何在像素着色器中处理alpha分量有什么不寻常之处吗?我有一个WPF应用程序,我的艺术家为我提供灰度图像作为背景,应用程序根据当前状态着色这些图像.所以我写了一个像素着色器(使用WPF像素着色器效果库基础结构)来用作Image元素的效果.着色器将颜色作为参数,将其转换为HSL,以便操作亮度.然后,对于每个灰色像素,它计算亮度在颜色参数和白色之间插入的颜色与源像素的亮度成比例.
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 src = tex2D(implicitInputSampler, uv);
// ...Do messy computation involving src brightness and color parameter...
float4 dst;
dst.r = ...
dst.g = ...
dst.b = ...
dst.a = src.a;
return dst;
}
Run Code Online (Sandbox Code Playgroud)
这对于alpha = 1的像素效果很好.但是在alpha = 0的情况下,结果像素变白,而不是让窗口的背景显示出来.所以我做了一个微小的改变:
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 src = tex2D(implicitInputSampler, uv);
if (src.a == 0)
return src;
...
Run Code Online (Sandbox Code Playgroud)
而现在透明的部分确实是透明的.为什么?为什么dst.a = src.a第一个版本的声明没有实现呢?不幸的是,即使这只是一个部分修复,因为它看起来像0 <alpha <1的像素是白色的.
有谁知道我不了解alpha?
如何用指定的背景颜色替换任何图像(png,jpg,rgb,rbga)的alpha通道?它还必须适用于没有Alpha通道的图像.