我正在编写一个颜色选择器,可以从屏幕上的任何位置获取像素RGB值.我想也可以选择指定我选择的颜色已经具有alpha值.我只是想知道如何计算得到的颜色.
例如:
得到的像素颜色是240,247,249,但我知道原始颜色的不透明度为10%,并且背景为白色(255,255,255).计算原始RGB值的计算是什么?
我正在创建一个非常简单的Win32 C++应用程序,它的唯一目的就是只显示一个半透明的PNG.窗口不应该有任何镶边,并且所有不透明度都应该在PNG本身中控制.
我的问题是当窗口下的内容发生变化时,窗口不会重新绘制,因此PNG的透明区域与应用程序最初启动时窗口下的内容"卡住".
这是我设置新窗口的行:
hWnd = CreateWindowEx(WS_EX_TOPMOST, szWindowClass, szTitle, WS_POPUP, 0, height/2 - 20, 40, 102, NULL, NULL, hInstance, 0);
Run Code Online (Sandbox Code Playgroud)
对于RegisterClassEx的调用,我有这个背景集:
wcex.hbrBackground = (HBRUSH)0;
Run Code Online (Sandbox Code Playgroud)
这是WM_PAINT消息的处理程序:
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
Gdiplus::Graphics graphics(hdc);
graphics.DrawImage(*m_pBitmap, 0, 0);
EndPaint(hWnd, &ps);
break;
}
Run Code Online (Sandbox Code Playgroud)
需要注意的一点是,应用程序始终停靠在屏幕左侧,不会移动.但是,当用户打开,关闭或移动其下的窗口时,应用程序下面的内容可能会发生变化.
当应用程序首次启动时,它看起来很完美.PNG的透明(和类似透明)部分完美展现.但是,当应用程序下面的背景发生变化时,后台不会更新,它会在应用程序首次启动时保持不变.实际上,WM_PAINT(或WM_ERASEBKGND在后台更改时不会被调用).
我已经玩了很长一段时间了,已经接近100%正确,但不是那里.例如,我尝试将背景设置为(HBRUSH)NULL_BRUSH,我尝试处理WM_ERASEBKGND.
当窗口下的内容发生变化时,可以做些什么来重新绘制窗口?
我正在尝试测量WebKit补丁的可能性,这将允许所有渲染的图形渲染到完全透明的背景上.
所需的效果是呈现没有任何背景的Web内容,它应该浮动在桌面上(或浏览器窗口后面显示的任何内容).
有没有人看过应用程序这样做?(我可以想到一些终端模拟器可以.)如果有人在WebKit内部工作(或者可能是Gecko?)你认为有可能这样做吗?
更新:我已经意识到Mac OSX仪表板小部件使用这种确切的技术.所以,这一定是可能的.
更新2:我在linux上编译了WebKit并注意到配置选项包括:
--enable-dashboard-support
enable Dashboard support default=yes
Run Code Online (Sandbox Code Playgroud)
我越走越近了.有人可以帮忙吗?
更新3:我继续在各种相关邮件列表的帖子中找到对此的引用.
我正在尝试将背景与前景图像混合,其中前景图像是带有线条的透明图像.
我试图这样做.
UIGraphicsBeginImageContext(CGSizeMake(320, 480));
CGContextRef context = UIGraphicsGetCurrentContext();
// create rect that fills screen
CGRect bounds = CGRectMake( 0,0, 320, 480);
// This is my bkgnd image
CGContextDrawImage(context, bounds, [UIImage imageNamed:@"bkgnd.jpg"].CGImage);
CGContextSetBlendMode(context, kCGBlendModeSourceIn);
// This is my image to blend in
CGContextDrawImage(context, bounds, [UIImage imageNamed:@"over.png"].CGImage);
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIImageWriteToSavedPhotosAlbum(outputImage, self, nil, nil);
// clean up drawing environment
//
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)
但似乎没有用.
任何建议将不胜感激.
一个新手问题
我有这个layer.xml,我用它作为ImageView的源.还有两个图像,mask.png和image.jpg
layers.xml:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<bitmap android:src="@drawable/image" android:gravity="center"/>
</item>
<item>
<bitmap android:src="@drawable/mask" android:gravity="center"/>
</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)
ImageView的:
<ImageView
android:id="@+id/img_B"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/layers"/>
Run Code Online (Sandbox Code Playgroud)
目前输出只是图像上的png.我希望png充当面具,使用png alpha通道剪切图像,如下所示:

这可能直接在xml中,或者我必须通过代码来完成吗?
谢谢你的建议 ;)
更新:目前我使用代码替换整个ImageView实现了我的目标
ImageView img = (ImageView) findViewById(imgID);
Canvas canvas = new Canvas();
Bitmap mainImage = BitmapFactory.decodeResource(getResources(), R.drawable.img);
Bitmap mask = BitmapFactory.decodeResource(getResources(), R.drawable.mask);
Bitmap result = Bitmap.createBitmap(mainImage.getWidth(), mainImage.getHeight(), Bitmap.Config.ARGB_8888);
canvas.setBitmap(result);
Paint paint = new Paint();
paint.setFilterBitmap(false);
canvas.drawBitmap(mainImage, 0, 0, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(mask, 0, 0, paint);
paint.setXfermode(null);
img.setImageBitmap(result);
img.invalidate();
Run Code Online (Sandbox Code Playgroud) 是否有可能在Three.js中的同一面上将多个纹理叠加在一起,以便在webGL中加速alpha加速?
纹理(或应该)应用于同一面,使得底部纹理(纹理1)没有alpha通道,并且上面的纹理以类似下面图像示例中的纹理2的方式被引导.
这种混合可以使用HTML5 Canvas作为前置步骤来实现,但由于纹理位图可能很大,我更喜欢跳过Canvas混合操作.
我通过创建网格的副本并对每个网格应用一个纹理进行测试,并使其他网格透明并移动了一点,几乎成功,但有一些闪烁,因为对象不能完全在同一位置,有一些纹理之间的空间不是正确的效果.他们看起来应该像是混合在一起.Photoshop(如下图所示).

我正在尝试将RGBA图像(前景图像)的alpha混合操作转换为RGB图像(背景图像).但是,在这样做的时候,我想我可能正在做错误的alpha混合操作或做错了.例如,我的RGB图像的像素是(127,127,127)的浅灰色.像素的RGBA图像的像素将是(0,0,255).在进行混合操作后,最终颜色将为(127,0,255).但是,我认为这更像是一种添加剂混合物,与我正在进行的操作不同.
关于如何设置我的值,请看一下
incPixelColor[0] = 0; (red)
incPixelColor[1] = 0; (green)
incPixelColor[2] = 255; (blue)
incPixelColor[3] = 255; (alpha)
currentPixelColor[0] = 127; (red)
currentPixelColor[1] = 127; (green)
currentPixelColor[2] = 127; (blue)
Run Code Online (Sandbox Code Playgroud)
关于我的计算方法,请看一下
float incAlpha = (currentPixelColor[3]/255.0f);
float red = ((float)incPixelColor[0]/255.0f * incAlpha) + ((float)currentPixelColor[0]/255.0f);
float green = ((float)incPixelColor[1]/255.0f * incAlpha) + ((float)currentPixelColor[1]/255.0f);
float blue = ((float)incPixelColor[2]/255.0f * incAlpha) + ((float)currentPixelColor[2]/255.0f);
currentPixelColor[0] = min(red * 255, 255.0f);
currentPixelColor[1] = min(green * 255, 255.0f);
currentPixelColor[2] = min(blue * 255, 255.0f);
Run Code Online (Sandbox Code Playgroud)
对于没有alpha的像素,我希望该值为(0,0,255),然后对于具有alpha的图像,我希望它能够融入.在上面的操作结束时,它将是(127,127) ,255).我应该检查每个像素是否有alpha,如果有,那么进行混合还是有其他方法可以做到这一点?
algorithm image-manipulation alphablending image-processing alpha-transparency
我正在开发一款游戏,我希望在网格上的一系列精灵下创建阴影.阴影大于精灵本身,精灵是动画的(即移动和旋转).
我不能简单地将它们渲染到精灵png中,否则阴影会与相邻的精灵重叠.
我也不能简单地将阴影放在较低的层上,因为当它们重叠时,它们会在它们的交叉处产生暗带.
这些精灵是动画的,因此不可能整体渲染这些精灵.
基本上,我希望精灵的阴影能够融合在一起,使它们在设定的不透明度下最大化.例:
我相信这相当于一个openGL混合(Rs,Gs,Bs,Max(As,Ds)),我并不真正关心R,G和B,因为它在src中始终是相同的颜色和dst.
但是,这不是有效的openGL混合模式.有没有一种简单的方法来实现这一点,尤其是在cocos2d-iphone中?
我可以通过使阴影精灵不透明,然后将它们应用于父精灵,并使父精灵40%不透明度来近似.但是,cocos2d的工作方式,这只会将每个子项的不透明度设置为40%,而不是组合的精灵图像,这会产生相同的条带.
我通过帧缓冲对象渲染到纹理,当我绘制透明图元时,图元与在单个绘制步骤中绘制的其他图元正确混合,但它们没有与帧缓冲区的先前内容正确混合.
有没有办法正确地将纹理内容与新数据混合?
编辑:更多信息需要,我会尝试更清楚地解释;
我使用的blendmode是GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA.(我相信这通常是标准的混合模式)
我正在创建一个跟踪鼠标移动的应用程序.它绘制了将前一个鼠标位置连接到当前鼠标位置的线条,因为我不想在每个帧上再次绘制线条,我想我会绘制一个纹理,从不清除纹理然后只绘制一个矩形它上面的纹理来显示它.
这一切都很好,除了当我在纹理上绘制alpha小于1的形状时,它不能与纹理的先前内容正确混合.假设我有一些黑色线条,alpha = .6被绘制到纹理上.一对夫妇画了一个周期之后,我在那些线上画了一个alpha = .4的黑色圆圈.圆圈"下方"的线条被完全覆盖.虽然圆圈不是扁平的黑色(它与白色背景正确混合),但圆圈下方没有"深色线条",正如您所期望的那样.
但是,如果我在同一帧中绘制线条和圆圈,它们会正确混合.我的猜测是纹理不会与之前的内容混合.它就像它只与glclearcolor混合.(在这种情况下,<1.0f,1.0f,1.0f,1.0f>)
我正在尝试使用与此类似的渐变创建热图:

此图像显示三个点,渐变很好地融合在一起.
这是我目前在绘图功能中所做的事情:
public void DrawGradient(int x, int y, Graphics g) {
using (var ellipsePath = new GraphicsPath()) {
var bounds = new Rectangle(x, y, 100, 100);
ellipsePath.AddEllipse(bounds);
var brush = new PathGradientBrush(ellipsePath);
Color[] colors = {
Color.FromArgb(64, 0, 0, 255),
Color.FromArgb(140, 0, 255, 0),
Color.FromArgb(216, 255, 255, 0),
Color.FromArgb(255, 255, 0, 0)
};
float[] relativePositions = {0f,0.25f,0.5f, 1.0f};
ColorBlend colorBlend = new ColorBlend();
colorBlend.Colors = colors;
colorBlend.Positions = relativePositions;
brush.InterpolationColors = colorBlend;
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.SmoothingMode …Run Code Online (Sandbox Code Playgroud)