我正在使用 C++Builder 10.2 Tokyo 开发 VCL Windows 桌面应用程序。
我有以下尝试从 TBitmap 对象中读取像素,以便进行进一步的基于像素的操作。但是,即使代码正确识别 32 位格式并相应地创建位图图像,我也无法使用 TBitmap::ScanLine 读出正确的像素信息。
使用的图像不是黑色的,但从 pBMP 读取的 RGB 值全部为零,Alpha 值为 6、17、34 等。这似乎是损坏或未初始化的数据。
//given png image saved as application resource
std::unique_ptr<TResourceStream> pRes(new TResourceStream(
reinterpret_cast<NativeUInt>(HInstance),
L"a_png_resource_name",
RT_RCDATA));
std::unique_ptr<TPngImage> pPNG(new TPngImage());
pPNG->LoadFromStream(pRes.get());
std::unique_ptr<TBitmap> pBMP(new TBitmap());
pBMP->Assign(pPNG.get());
pBMP->SaveToFile(L"resulting_image.bmp"); //it creates bmp with correct RGBA content
assert(pBMP->PixelFormat == pf32bit); //just confirm we have correct format to access pixels
for (int i = 0; i < pBMP->Height; i++) {
Pixel* FirstPixelInLine = (Pixel*)pBMP->ScanLine[i];
for (int j = 0; j < pBMP->Width; j++) {
Pixel* p = FirstPixelInLine + j;
OutputDebugString((L"R: " + std::to_wstring(p->Red) +
L" G: " + std::to_wstring(p->Green) +
L" B: " + std::to_wstring(p->Blue) +
L" A: " + std::to_wstring(p->Alpha)).c_str());
}
}
而Pixel的定义如下:
struct Pixel {
BYTE Blue;
BYTE Green;
BYTE Red;
BYTE Alpha;
};