gpt4 book ai didi

c++ - 在保持透明背景的同时调整 HBITMAP 的大小

转载 作者:行者123 更新时间:2023-11-30 03:26:51 25 4
gpt4 key购买 nike

我有一个加载具有透明背景的图像的应用程序,然后我使用 StretchBlt 将其调整为所需的大小,使用 SetStretchBltMode 设置 HALFTONE (我尝试使用其他模式,在保持透明度不变的同时,也使调整大小后的图像看起来“丑陋”)。
但是,StretchBlt 将透明背景替换为不适合显示图像的窗口背景的颜色(黑色)。

所以我有两个选择:
1) 将图像的透明背景替换为窗口的背景色,然后使用StretchBlt
调整大小2) 在保持背景透明度的同时调整它的大小(首选选项)

我尝试寻找可提供任一功能的 WinAPI 函数,但没有找到。

我如何使用普通 WinAPI 执行这些选项中的任何一个(替换透明度或在保持透明度的同时调整其大小)?

最佳答案

首先,BitBltStretchBltTransparentBlt 不支持 alpha channel ..

TransparentBlt 的工作原理是使您想要的任何指定颜色透明。

如果你想要 Alpha channel 和混合支持,你需要:AlphaBlend

您可以执行以下操作:

BLENDFUNCTION fnc;
fnc.BlendOp = AC_SRC_OVER;
fnc.BlendFlags = 0;
fnc.SourceConstantAlpha = 0xFF;
fnc.AlphaFormat = AC_SRC_ALPHA;

//You need to create a memDC.. and an HBITMAP..

//Select the hBitmap into the memDC.
HGDIOBJ obj = SelectObject(memDC, hBmp);

//Render with alpha blending..
AlphaBlend(DC, rect.X, rect.Y, rect.Width, rect.Height, memDC, 0, 0, Width, Height, fnc);

//Restore the memDC to original state..
SelectObject(memDC, obj);

或者通过自己计算 channel 颜色来进行自己的预乘 alpha 渲染..

或者,您可以尝试 GDI+,看看结果如何:

ULONG_PTR GdiImage::GDIToken = 0;
Gdiplus::GdiplusStartupInput GdiImage::GDIStartInput = NULL;
Gdiplus::GdiplusStartup(&GdiImage::GDIToken, &GdiImage::GDIStartInput, NULL);

Gdiplus::Image* Img = Gdiplus::Image::FromFile(L"PathToImage.ext"); //where ext can be png, bmp, etc..

Gdiplus::Graphics graphics(DC);
//graphics.SetSmoothingMode(SmoothingModeHighSpeed);
graphics.SetInterpolationMode(Gdiplus:: InterpolationModeBilinear); //InterpolationModeNearestNeighbor
//graphics.SetPixelOffsetMode(Gdiplus::PixelOffsetModeHalf);
graphics.DrawImage(Img, x, y, w, h);

delete Img;
Gdiplus::GdiplusShutdown(GdiImage::GDIToken);
GdiImage::GDIStartInput = NULL;
GdiImage::GDIToken = 0;

关于c++ - 在保持透明背景的同时调整 HBITMAP 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47969934/

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