Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 保存的Gdiplus::位图始终具有Alpha通道(RGBA/ARGB)_C++_Bitmap_Png_Gdi+_Pixelformat - Fatal编程技术网

C++ 保存的Gdiplus::位图始终具有Alpha通道(RGBA/ARGB)

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)

我有一个PixelFormat32bppARGB格式的Gdiplus::位图(在C++中),并使用以下命令将其转换为PixelFormat32bppRGB:

        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);