gpt4 book ai didi

c++ - 将 MFC Cimage 初始化为纯色

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:04:57 26 4
gpt4 key购买 nike

我不使用 C++ 或 MFC/ATL 等,所以假设我什么都不知道。

整个画面是我需要接受一个带有透明层的 PNG 并将其写成具有指定压缩率的 JPEG 以传递给另一个系统。

我想知道的是,我如何用纯白色初始化 objective-c Image 结构?

到目前为止我已经这样做了(是的,我知道它还有其他风格问题)

    void ClipBoardFuncs::savePNGASJPEG(char filePath[256], char errorBuff[256]) {
int sizeOfErrorBuff = 256;

CImage imagePNG;
CImage imageJPG;
int xPNG, yPNG = 0;
imagePNG.Load(filePath);

xPNG = imagePNG.GetWidth();
yPNG = imagePNG.GetHeight();

//Create my target JPG same size and bit depth specifiying that there is no alpha channel (dwflag last param)
imageJPG.Create(xPNG, yPNG, imagePNG.GetBPP(), 0);

//Let there be white....
for (int x = 0; x <= xPNG; x++)
{
for (int y = 0; y <= yPNG; y++)
{
imageJPG.SetPixelRGB(x, y, 255, 255, 255);
}
}

//Copy the image over onto on the white
//BitBlt copies everything....
//imagePNG.BitBlt(imageJPG.GetDC(), 0, 0);
//Draw is more like the C# draw examples I've seen
imagePNG.Draw(imageJPG.GetDC(), 0, 0);

imageJPG.ReleaseDC();

HRESULT hr = NULL;
hr = imageJPG.Save(filePath, Gdiplus::ImageFormatJPEG);
imagePNG.Destroy();
imagePNG.ReleaseGDIPlus();

imageJPG.Destroy();
imageJPG.ReleaseGDIPlus();


LPCTSTR error = _com_error(hr).ErrorMessage();
strncpy_s(errorBuff, sizeOfErrorBuff, _com_error(hr).ErrorMessage(), _TRUNCATE);

}

可爱的 C# 人有这样的答案:

Convert Transparent PNG to JPG with Non-Black Background Color

但我需要 c++ MFC 解决方案以用作 DLL 中的导出函数。

我所说的导出函数是指与您在 kernel32.dll 中找到的相同架构 - 抱歉,我不知道用什么术语来区分那种 DLL 和充满 COM 对象的 DLL。

谁能建议一种比我这里的嵌套 x/y for 循环更快的方法来将 imageJPEG 结构初始化为纯白色?

干杯

4GLGuy

最佳答案

可以使用 RectangleFillRect 进行初始化(为此,FillRect 可能是首选--Rectangle 以当前画笔颜色绘制矩形的轮廓,我们可能不需要)。

因此,序列看起来像这样:

CImage png;
png.Load(pDoc->filename);

CRect rect{ 0, 0, png.GetWidth(), png.GetHeight() };

CImage jpeg;
jpeg.Create(rect.Width(), rect.Height(), png.GetBPP());

auto dc = jpeg.GetDC();
HBRUSH white = CreateSolidBrush(RGB(255, 255, 255));
FillRect(dc, &rect, white);

png.Draw(dc, 0, 0);
jpeg.ReleaseDC();

jpeg.Save(L"Insert File name here", Gdiplus::ImageFormatJPEG);

jpeg.Destroy();
jpeg.ReleaseGDIPlus();
png.ReleaseGDIPlus();

GDI+ 足够“智能”,当您使用具有 alpha channel 的图像执行 .Draw 时,它会考虑该 channel ,而无需使用 TransparentBlt(或任何类似的东西)。

SetTransparentColor用于您在此处尝试执行的操作。 SetTransparentColor 适用于 具有 alpha channel (“透明层”)的图像。然后,您可以使用它来选择一种颜色,这种颜色将被视为透明——这当然很有用,但不是您想要的。

您可以改用 memset,但仅限于红色、绿色和蓝色 channel 都具有相同值(即黑色、白色或某种灰色阴影)的颜色。否则,您可以使用嵌套循环自行填充,但在大多数情况下,您可能想改用 FillRect(它可能能够使用图形硬件进行加速,循环会很漂亮可靠地只在 CPU 上运行——最坏的情况下,它们的速度大致相同,但在某些情况下 FillRect 会更快)。

关于c++ - 将 MFC Cimage 初始化为纯色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52174927/

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