如果可以创建具有alpha混合透明度的CImageList,我想知道.
创建具有丑陋透明度的CImageList的示例代码(无alpha混合)
CGdiPlusBitmapResource m_pBitmap;
m_pBitmap.Load(IDB_RIBBON_FILESMALL,_T("PNG"),AfxGetResourceHandle());
HBITMAP hBitmap;
m_pBitmap.m_pBitmap->GetHBITMAP(RGB(0,0,0),&hBitmap );
CImageList *pList=new CImageList;
CBitmap bm;
bm.Attach(hBitmap);
pList->Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, 4);
pList->Add(&bm, RGB(255,0,255));
Run Code Online (Sandbox Code Playgroud) 我试图混合具有透明区域的纹理:
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, ...);
glVertexPointer( 2, GL_FLOAT, 0, ... );
glEnable (GL_BLEND);
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 );
Run Code Online (Sandbox Code Playgroud)
除非我添加glDisable(GL_DEPTH_TEST),否则顶部纹理的透明部分会覆盖它们下面的所有内容(而不是混合).有没有办法在不禁用深度的情况下做到这一点?我尝试了各种混合功能但没有帮助.
我想在Delphi表单上绘制透明图像,但它不起作用.
这是原始的PNG:

我已经在TImage中加载了图像::
Image1.Transparent := True;
Form1.Color := clWhite;
Form1.TransparentColor := True;
Form1.TransparentColorValue := clWhite;
Run Code Online (Sandbox Code Playgroud)

应用程序:

图像不完全透明.
图像可以通过任何控件或仅通过画布绘制.
我想使用BMP图像.
也许我做错了什么?
请帮忙!
我有一个径向alpha渐变的png,因此在边缘处它的黑色和中心是完全透明的,具有漂亮的平滑渐变.
当我加载我的Bitmap并将其显示在SurfaceView Canvas上时,我会得到不好的alpha条带.而不是一个漂亮的平滑渐变,alpha值似乎跳下来并导致所有相同alpha值的大带.
据我所知,带有alpha通道的位图在加载或绘制时不应转换.如何在画布上正确绘制我的png?
任何帮助将不胜感激,谢谢!= d
我想结合两个alpha层,只应用于源层的特定部分.我试过的一种方法是将SourceConstantAlpha设置为$ ff(并让函数使用源图层中的alpha通道).
这种作品 - 尽管速度很慢(我想我可以通过使用ScanLines来加快速度),但这部分是因为我无法弄清楚将alpha通道设置为什么.文档表明计算是:
st.Red = Src.Red + (1 - Src.Alpha) * Dst.Red
Run Code Online (Sandbox Code Playgroud)
我通过猜测工作尝试了一些不同的值,但我的第一个问题是:我如何计算alpha值?
在阅读了其他一些SO问题之后,我遇到了TransparentBlt函数,它可以很好地屏蔽(和快速)但不透明,有没有办法将这两个调用组合在一起(可能使用第三层)?
unit MainWnd;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ControlsEx;
type
{------------------------------------------------------------------------------}
TfrmMain = class(TForm)
PaintBox1: TPaintBox;
procedure PaintBox1Paint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
{..............................................................................}
procedure copyToAlpha(const in_bitmap : TBitmap; const in_transparentColor : TColor;
const in_transparency : integer);
var
x : …Run Code Online (Sandbox Code Playgroud) 我有一个TFT显示屏,可以绘制16位颜色,格式RGB 565.我想为我显示的内容添加一些透明度.
假设我有一个黑色背景(0x0000),我想画一个半透明的白色前景(0xFFFF)(不透明度由另一个字节控制),所以它会显示为灰色.如何以相同的RGB 565格式计算16位灰色,这样我就可以将它发送到我的TFT并且它会正确显示(可能有一些损失,但我不在乎)?
我需要一个功能,如:
unsigned short calcColor_RGB565(unsigned short background_RGB565, unsigned short foreground_RGB565, unsigned char opacity)
Run Code Online (Sandbox Code Playgroud)
calcColor_RGB565(0x0000, 0xFFFF, 128) 会导致0x8410(或0x1084,这并不重要,因为我向TFT发送两个单独的字节,所以如果需要我只会反转顺序)
感谢任何可以帮助我的人,我已经尝试了一些东西,但我无法得到正确的结果,甚至没有关闭:/.
类似C的伪代码赞赏,但我更喜欢解释如何做到这一点.
编辑:忘了说,我希望它尽可能快,因为它是一个旧的微处理器,所以如果分别计算2个字节更快(所以我也不必在以后将它们分开)然后我'我对这种优化非常感兴趣.
编辑9月27日:5天后,仍未解决.我可以从rgb565转换为rgb8888,进行alpha混合然后转换回rgb565,但这太慢了,必须有更好的方法!
如何AlphaBlend在FireMonkey桌面应用程序中更改(表单的)值?好吧它可以在VCL应用程序中使用,但我在FireMonkey中找不到它.
截图:

我试图以最有效的方式将两个图像与OpenCV混合.目前,我有这个:
// Input matrices to mix
cv::Mat A(w, h, CV_8UC3);
cv::Mat B(w, h, CV_8UC3);
// Mix factor
cv::Mat alpha(w, h, CV_8UC1);
// Have to multiply alpha channel for mul() function
std::vector<cv::Mat> array{alpha, alpha, alpha};
cv::Mat alpha_multichannel;
cv::merge(array, alpha_multichannel);
cv::Mat result = A.mul(alpha_multichannel, 1./255) + B.mul(cv::Scalar(255, 255, 255) - alpha_multichannel, 1./255);
Run Code Online (Sandbox Code Playgroud)
目前,这在图像上至少循环四次(对于alpha_multichannel图像,对于A.mul,对于B.mul和总和),尽管使用自定义循环,它可以在一个循环中完成.
有一个更好的方法吗?
我正在使用 regl 渲染圆圈,并且有三个目标:
更新:演示链接现在反映了有效的、已接受的答案。下面的代码不变。
索引.js
const regl = require('regl');
const glsl = require('glslify');
const vertexShader = glsl.file('../shaders/vertex.glsl');
const fragmentShader = glsl.file('../shaders/fragment.glsl');
// Create webgl context and clear.
const canvasEl = document.querySelector('canvas');
const app = regl({
canvas: canvasEl,
extensions: ['OES_standard_derivatives']
});
app.clear({color: [0, 0, 0, 0], depth: 1});
// Generate random points and colors.
const attributes = {position: [], color: []};
for (let i = 0; i < 100; i++) { …Run Code Online (Sandbox Code Playgroud) 我在Metal中渲染半透明精灵时遇到麻烦。我已经阅读了这个问题,而这个问题,而这一次,和这个线程在苹果的论坛上,还有几个,但不能完全得到它的工作,所以请标志着这个问题作为一个重复之前阅读。
我的参考纹理有四行四列。这些行分别是完全饱和的红色,绿色,蓝色和黑色。列的不透明度从100%不透明到25%不透明(依次为1、0.75、0.5、0.25 alpha)。
在Pixelmator(我创建它的地方)上,它看起来像这样:
如果在导出之前插入完全不透明的白色背景,它将看起来像这样:
... 但是,当我将其纹理映射到Metal中的四边形上,并在将背景清除为不透明的白色(255、255、255、255)后进行渲染时,我得到了:
...显然比不透明的碎片要暗(后面的亮白色应“渗出”)。
我将png文件作为纹理资产导入到Xcode中,作为我应用程序资产目录中的纹理资产,并在运行时使用加载了该文件MTKTextureLoader。该.SRGB选项似乎没有什么不同。
就我所知,着色器代码没有做任何花哨的事情,但仅供参考:
#include <metal_stdlib>
using namespace metal;
struct Constants {
float4x4 modelViewProjection;
};
struct VertexIn {
float4 position [[ attribute(0) ]];
float2 texCoords [[ attribute(1) ]];
};
struct VertexOut {
float4 position [[position]];
float2 texCoords;
};
vertex VertexOut sprite_vertex_transform(device VertexIn *vertices [[buffer(0)]],
constant Constants &uniforms [[buffer(1)]],
uint vertexId [[vertex_id]]) { …Run Code Online (Sandbox Code Playgroud) alphablending ×10
delphi ×3
alpha ×1
android ×1
bitmap ×1
blending ×1
c ×1
c++ ×1
canvas ×1
colors ×1
delphi-7 ×1
delphi-xe5 ×1
firemonkey ×1
gdi ×1
glsl ×1
image ×1
metal ×1
mfc ×1
opencv ×1
opengl-es ×1
optimization ×1
ownerdrawn ×1
performance ×1
regl ×1
shader ×1
textures ×1
transparency ×1
xcode ×1