1

我正在使用 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;
};
4

0 回答 0