将MFC图像初始化为纯色 我不使用C++或MFC/ATL等,所以假设我一无所知。

将MFC图像初始化为纯色 我不使用C++或MFC/ATL等,所以假设我一无所知。,c++,mfc,png,atl,alpha-transparency,C++,Mfc,Png,Atl,Alpha Transparency,整个图片是,我需要接受一个带有透明层的PNG,并将其以JPEG格式写入指定的压缩,以传递到另一个系统 这里我想知道的是,如何用纯白初始化目标CImage结构 到目前为止我已经这样做了(是的,我知道它还有其他风格问题) void ClipBoardFuncs::savePNGASJPEG(char filePath[256],char errorBuff[256]){ int-sizeOfErrorBuff=256; CImage-imagePNG; CImage-imageJPG; int xP

整个图片是,我需要接受一个带有透明层的PNG,并将其以JPEG格式写入指定的压缩,以传递到另一个系统

这里我想知道的是,如何用纯白初始化目标CImage结构

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

void ClipBoardFuncs::savePNGASJPEG(char filePath[256],char errorBuff[256]){
int-sizeOfErrorBuff=256;
CImage-imagePNG;
CImage-imageJPG;
int xPNG,yPNG=0;
加载(文件路径);
xPNG=imagePNG.GetWidth();
yPNG=imagePNG.GetHeight();
//创建相同大小和位深度的目标JPG,指定没有alpha通道(dwflag last param)
Create(xPNG,yPNG,imagePNG.GetBPP(),0);
//让这里有白色的。。。。
对于(int x=0;x
每次调用
GetDC
都必须有一个后续调用
ReleaseDC
。另请参阅文档

CImage::GetDC
提供内存设备上下文的句柄。此句柄可用于使用标准GDI函数绘制。稍后应使用
CImage::ReleaseDC
清理句柄

CImage::Draw
可能不知道透明颜色是什么。您必须使用
TransparentBlt
来告诉它透明颜色是什么。例如,要将红色替换为白色:

HDC hdc = imageJPG.GetDC();
CDC dc;
dc.Attach(hdc);
CRect rc(0, 0, xPNG, yPNG);
dc.FillSolidRect(&rc, RGB(255, 255, 255));
dc.Detach();

imagePNG.TransparentBlt(hdc, rc, RGB(255, 0, 0));//replace red with white
imageJPG.ReleaseDC();

...
imageJPG.Save(...);

或者只需使用
CImage::SetTransparentColor

imagePNG.SetTransparentColor(RGB(255, 0, 0));
imagePNG.Draw(hdc, rc);

for(int x=0;x可以使用
Rectangle
FillRect
进行初始化(对于这一点,
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通道的图像绘制
.Draw
时,它会将该通道考虑在内,而无需使用
透明TBLT
(或任何类似工具)

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


您可以改为使用
memset
,但仅适用于红色、绿色和蓝色通道都具有相同值(即黑色、白色或一些灰色阴影)的颜色。否则,您可以使用嵌套循环自行填充,但在大多数情况下,您可能希望改为使用
FillRect
(它可能能够使用图形硬件进行加速,循环将非常可靠地运行在CPU上——最坏的情况是,它们的速度差不多,但在某些情况下,
FillRect
会更快)。

感谢支持-当我添加CBrush行时,它没有被识别,所以我查找了类定义()并包含了afxwin.h。这导致链接器执行了我在其线程中发现的操作,它目前正在抱怨windows.h被包含在afxv_w32.h中-正在处理它。这是因为我开始使用一个控制台应用程序吗?我修改了它,但它又变黑了-可惜它太快了。正在处理它…@4GLGuy:我已经修改了代码展示如何在没有MFC CBrush的情况下完成工作(实际上是一个微不足道的变化)。(微不足道-这是一个我可以用来描述我对MFC知识水平的词)感谢你抽出时间为我做这件事。我一直在看其他类型的刷子,但没有信心断言一把刷子和另一把刷子差不多。我将给你看我和查尔、瓦查尔特和CSTON一起玩的乐趣和游戏,但这可能会让你沮丧。第一次我的C++为傻瓜书(1994)。已经在本世纪开放。
imagePNG.SetTransparentColor(RGB(255, 0, 0));
imagePNG.Draw(hdc, rc);
for (int x = 0; x <= xPNG; x++){...}
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();