无法创建图像位图 C++
Unable to create image bitmap c++
我的目标是按像素分析图像(以确定颜色)。我想从图像路径在 C++ 中创建位图:
string path = currImg.path;
cout << path << " " << endl;
然后我做了一些需要的类型更改,因为位图构造函数不接受简单的字符串类型:
wstring path_wstr = wstring(path.begin(), path.end());
const wchar_t* path_wchar_t = path_wstr.c_str();
最后构造位图:
Bitmap* img = new Bitmap(path_wchar_t);
在调试模式下,我看到 Bitmap 为空:
如何构建位图来逐像素扫描照片以了解每个像素的颜色?
首先你需要提供 headers 位图图像文件格式...然后逐字节读取它。
那么图像像素数据就在 headers 结束的地方。 headers 还包含像素数据开始位置的偏移量...
然后您可以通过计算宽度高度和每个像素的字节数来一次读取像素数据...
您还需要在行尾进行填充,以考虑宽度不能被四整除的图像。
基本上你需要写一个位图图像解析器...
确保以二进制模式打开位图文件...
更多信息在这里...
要么Gdiplus::GdiplusStartup
没有调用,函数失败。或者文件名不存在,函数失败。无论哪种方式 img
都是 NULL
.
由于错误的 UTF16 转换,上述代码中的文件名可能有误。仅当源为 ASCII 时,原始 string
到 wstring
的副本才能工作。这在非英语系统上很可能会失败(即使在英语系统上也很容易失败)。请改用 MultiByteToWideChar
。理想情况下,使用 UTF16 开始(虽然在控制台程序中有点困难)
int main()
{
Gdiplus::GdiplusStartupInput tmp;
ULONG_PTR token;
Gdiplus::GdiplusStartup(&token, &tmp, NULL);
test_gdi();
Gdiplus::GdiplusShutdown(token);
return 0;
}
测试以确保函数成功,然后再继续。
void test_gdi()
{
std::string str = "c:\path\filename.bmp";
int size = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, 0, 0);
std::wstring u16(size, 0);
MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, &u16[0], size);
Gdiplus::Bitmap* bmp = new Gdiplus::Bitmap(u16.c_str());
if (!bmp)
return; //print error
int w = bmp->GetWidth();
int h = bmp->GetHeight();
for (int y = 0; y < h; y++)
for (int x = 0; x < w; x++)
{
Gdiplus::Color clr;
bmp->GetPixel(x, y, &clr);
auto red = clr.GetR();
auto grn = clr.GetG();
auto blu = clr.GetB();
}
delete bmp;
}
我的目标是按像素分析图像(以确定颜色)。我想从图像路径在 C++ 中创建位图:
string path = currImg.path;
cout << path << " " << endl;
然后我做了一些需要的类型更改,因为位图构造函数不接受简单的字符串类型:
wstring path_wstr = wstring(path.begin(), path.end());
const wchar_t* path_wchar_t = path_wstr.c_str();
最后构造位图:
Bitmap* img = new Bitmap(path_wchar_t);
在调试模式下,我看到 Bitmap 为空:
如何构建位图来逐像素扫描照片以了解每个像素的颜色?
首先你需要提供 headers 位图图像文件格式...然后逐字节读取它。
那么图像像素数据就在 headers 结束的地方。 headers 还包含像素数据开始位置的偏移量...
然后您可以通过计算宽度高度和每个像素的字节数来一次读取像素数据...
您还需要在行尾进行填充,以考虑宽度不能被四整除的图像。
基本上你需要写一个位图图像解析器...
确保以二进制模式打开位图文件...
更多信息在这里...
要么Gdiplus::GdiplusStartup
没有调用,函数失败。或者文件名不存在,函数失败。无论哪种方式 img
都是 NULL
.
由于错误的 UTF16 转换,上述代码中的文件名可能有误。仅当源为 ASCII 时,原始 string
到 wstring
的副本才能工作。这在非英语系统上很可能会失败(即使在英语系统上也很容易失败)。请改用 MultiByteToWideChar
。理想情况下,使用 UTF16 开始(虽然在控制台程序中有点困难)
int main()
{
Gdiplus::GdiplusStartupInput tmp;
ULONG_PTR token;
Gdiplus::GdiplusStartup(&token, &tmp, NULL);
test_gdi();
Gdiplus::GdiplusShutdown(token);
return 0;
}
测试以确保函数成功,然后再继续。
void test_gdi()
{
std::string str = "c:\path\filename.bmp";
int size = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, 0, 0);
std::wstring u16(size, 0);
MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, &u16[0], size);
Gdiplus::Bitmap* bmp = new Gdiplus::Bitmap(u16.c_str());
if (!bmp)
return; //print error
int w = bmp->GetWidth();
int h = bmp->GetHeight();
for (int y = 0; y < h; y++)
for (int x = 0; x < w; x++)
{
Gdiplus::Color clr;
bmp->GetPixel(x, y, &clr);
auto red = clr.GetR();
auto grn = clr.GetG();
auto blu = clr.GetB();
}
delete bmp;
}