C++ 保存的Gdiplus::位图始终具有Alpha通道(RGBA/ARGB)
我有一个PixelFormat32bppARGB格式的Gdiplus::位图(在C++中),并使用以下命令将其转换为PixelFormat32bppRGB:C++ 保存的Gdiplus::位图始终具有Alpha通道(RGBA/ARGB),c++,bitmap,png,gdi+,pixelformat,C++,Bitmap,Png,Gdi+,Pixelformat,我有一个PixelFormat32bppARGB格式的Gdiplus::位图(在C++中),并使用以下命令将其转换为PixelFormat32bppRGB: Gdiplus::Bitmap* bitmapRGB = new Gdiplus::Bitmap(bitmap->GetWidth(), bitmap->GetHeight(), PixelFormat32bppRGB); Gdiplus::Graphics graphics(bitmapRGB)
Gdiplus::Bitmap* bitmapRGB = new Gdiplus::Bitmap(bitmap->GetWidth(), bitmap->GetHeight(), PixelFormat32bppRGB);
Gdiplus::Graphics graphics(bitmapRGB);
graphics.DrawImage(bitmap, Gdiplus::Point(0, 0));
如果我检查RGB位图的格式是否正确(RGB):
如果保存位图并检查其格式(即使用Gimp),则会有第四个通道
CLSID pngClsid;
GetEncoderClsid(L"image/png", &pngClsid);
bitmapRGB ->Save(path, &pngClsid, NULL);
如何获得RGB像素格式的png?
像素格式32bpprgb
仍然是32位<24位格式需要代码>像素格式24bpprgb:
Gdiplus::Bitmap* bitmapRGB = new Gdiplus::Bitmap(
bitmap->GetWidth(), bitmap->GetHeight(), PixelFormat24bppRGB);
不需要使用新的运算符,请使用适当的构造函数之一确保没有内存泄漏:
//convert:
Gdiplus::Bitmap bitmap(L"source.jpg");
Gdiplus::Bitmap bitmapRGB(bitmap.GetWidth(), bitmap.GetHeight(), PixelFormat24bppRGB);
Gdiplus::Graphics graphics(&bitmapRGB);
graphics.DrawImage(&bitmap, Gdiplus::Point(0, 0));
CLSID pngClsid;
GetEncoderClsid(L"image/png", &pngClsid);
bitmapRGB.Save(L"destination.png", &pngClsid);
“我有一个Gdiplus::位图(在C中)”这是不可能的。这不是有效的C代码。C没有::
或新操作符。C++确实是一种完全不同的语言。请花几秒钟选择正确的标记。为什么人们总是说“C++是一种完全不同的语言”?这掩盖了这样一个事实,即您可以用“C++”风格编写C,从而获得更好的类型检查的好处(以及查找C默认的bug)。所以“完全不同的语言”不允许这样。(您不能限制在LISP程序中使用什么,而希望C编译器编译它,因为LISP是一种完全不同的语言)。我在C++中为许多项目编写了“C”,并获得了好处,包括当嵌入式系统只有这样时,能够“回落”到C编译器。
//convert:
Gdiplus::Bitmap bitmap(L"source.jpg");
Gdiplus::Bitmap bitmapRGB(bitmap.GetWidth(), bitmap.GetHeight(), PixelFormat24bppRGB);
Gdiplus::Graphics graphics(&bitmapRGB);
graphics.DrawImage(&bitmap, Gdiplus::Point(0, 0));
CLSID pngClsid;
GetEncoderClsid(L"image/png", &pngClsid);
bitmapRGB.Save(L"destination.png", &pngClsid);