gpt4 book ai didi

c# - Vista/Windows 7 中字幕的透明度

转载 作者:行者123 更新时间:2023-11-30 04:35:10 25 4
gpt4 key购买 nike

我将 EVR 渲染器应用到我的播放器中以处理 Windows Vista+ 上糟糕的大小调整质量并遇到问题...

我的 EVR 有字幕叠加问题:

try to see what i'm talking about - 您必须在选项中设置 EVR。

我用它在 VMR9 上应用 32 位 alpha 位图,使用 DirectX 表面:

private void SetVRM9MixerSettings(int width, int height, int lines)
{
int hr = 0;
VMR9AlphaBitmap alphaBmp;

// Set Alpha Bitmap Parameters for using a Direct3D surface
alphaBmp = new VMR9AlphaBitmap();
alphaBmp.dwFlags = VMR9AlphaBitmapFlags.EntireDDS | VMR9AlphaBitmapFlags.FilterMode;

// on unmanagedSurface the bitmap was drawn with transparency
alphaBmp.pDDS = unmanagedSurface;
alphaBmp.rDest = GetDestRectangle(width, height, lines);
alphaBmp.fAlpha = 1.0f;
alphaBmp.dwFilterMode = VMRMixerPrefs.BiLinearFiltering;

// for anaglyph half SBS
if (FrameMode == Mars.FrameMode.HalfSideBySide)
{
alphaBmp.rDest.left /= 2;
alphaBmp.rDest.right /= 2;
}

// Set Alpha Bitmap Parameters
hr = mixerBitmap.SetAlphaBitmap(ref alphaBmp);
DsError.ThrowExceptionForHR(hr);

}

但是现在 MediaFoundation.NET 项目没有要设置的 alphaBmp.pDDS 指针,所以我不能使用 directdraw 表面并且需要使用 GDI(如果有人有办法做到这一点,那会很酷)。但是对于 GDI,我不能使用 32 位 alpha 位图来实现真正的透明度——我只能通过这种方法获得 1 位透明度:

 private void SetEVRMixerSettings(int width, int height, int subtitleLines)
{
MFVideoAlphaBitmap alphaBmp = new MFVideoAlphaBitmap();

//alphaBitmap is a 32bit semitransparent Bitmap
Graphics g = Graphics.FromImage(alphaBitmap);

// get pointer to needed objects
IntPtr hdc = g.GetHdc();
IntPtr memDC = CreateCompatibleDC(hdc);
IntPtr hBitmap = alphaBitmap.GetHbitmap();
IntPtr hOld = SelectObject(memDC, hBitmap);

alphaBmp.GetBitmapFromDC = true;
alphaBmp.stru = memDC;
alphaBmp.paras = new MFVideoAlphaBitmapParams();
alphaBmp.paras.dwFlags = MFVideoAlphaBitmapFlags.Alpha | MFVideoAlphaBitmapFlags.SrcColorKey | MFVideoAlphaBitmapFlags.DestRect;

// calculate destination rectangle
MFVideoNormalizedRect mfNRect = new MFVideoNormalizedRect();
NormalizedRect nRect = GetDestRectangle(width, height, subtitleLines);

mfNRect.top = nRect.top;
mfNRect.left = nRect.left;
mfNRect.right = nRect.right;
mfNRect.bottom = nRect.bottom;

// used when viewing half side by side anaglyph video that is stretched to full width
if (FrameMode == Mars.FrameMode.HalfSideBySide)
{
mfNRect.left /= 2;
mfNRect.right /= 2;
}

alphaBmp.paras.nrcDest = mfNRect;

// calculate source rectangle (full subtitle bitmap)
MFRect rcSrc = new MFRect();
rcSrc.bottom = alphaBitmap.Height;
rcSrc.right = alphaBitmap.Width;
rcSrc.top = 0;
rcSrc.left = 0;

alphaBmp.paras.rcSrc = rcSrc;

// apply 1-bit transparency
System.Drawing.Color colorKey = System.Drawing.Color.Black;
alphaBmp.paras.clrSrcKey = ColorTranslator.ToWin32(colorKey);

// 90% visible
alphaBmp.paras.fAlpha = 0.9F;

// set the bitmap to the evr mixer
evrMixerBitmap.SetAlphaBitmap(alphaBmp);

// cleanup
SelectObject(memDC, hOld);
DeleteDC(memDC);
g.ReleaseHdc();

}

所以问题是:

  • 如何使用 DirectDraw 表面在 EVR 视频上混合位图或
  • 如何在没有 DirectDraw 的情况下混合半透明位图?

非常感谢!

最佳答案

我会尝试回答第二个问题......

Alpha 混合是相当简单的任务。假设 alpha 在 0.0 - 1.0 的范围内,其中 0.0 表示完全透明,1.0 表示完全不透明。

R_result = R_Source * alpha + R_destination * (1.0 - alpha)

因为这里我们真的不需要 float ,所以我们可以将 alpha 切换到 0-255 的范围。

R_result = ( R_Source * alpha + R_destination * (255 - alpha) ) >> 8

你可以进一步优化它......这取决于你。
当然,G和B也是一样。

关于c# - Vista/Windows 7 中字幕的透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5574511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com