0

我有一个 Byte* 类型的 RGB 字节信息数组。
我可以使用电晕库将它保存到 PNG 文件中。
但是,我想以某种方式在 TImage-Object 上显示 Bytearray 而不必每次都保存和加载文件......
我已经找到了 memorystream 的解决方案

Byte* pBuffer;//data
long cbBuffer;//length of data
TMemoryStream *tmem=new TMemoryStream();
tmem->Write(pBuffer,cbBuffer);
TPngImage *saf=new TPngImage();
saf->LoadFromStream(tmem);

然而,这抱怨缺少标题,因为 bytearray 没有标题。
所以,我想创建一张空白图片并在上面绘制像素信息......

Graphics::TBitmap *Bitmap = new Graphics::TBitmap();  
Bitmap->Width = pVih->bmiHeader.biWidth;               
Bitmap->Height = pVih->bmiHeader.biHeight;              
for(int j=0;j<pVih->bmiHeader.biHeight;j++){
    Byte* y=(Byte*) Bitmap->ScanLine[j];
    for(int x=0;x<pVih->bmiHeader.biWidth;x++)
        y[x]=pBuffer[j*pVih->bmiHeader.biWidth+x];
}
Image1->Picture->Graphic=Bitmap;
Application->ProcessMessages();

但是,这保持空白。而且我真的不喜欢画像素,即使使用更快的 ScanLine ......

那么,有人知道如何在 TImage-Object 中显示颜色的 Bytearray 吗?
如果有一个整洁的库,你也可以建议它,但我尝试使用 pnglib 几次,我似乎不知道如何使用它。
我正在使用 Embarcadero 的 XE2 16 中的 C++Builder。

问候,
朱利安

4

1 回答 1

0

事后看来,可能有必要告诉我我收到的是 pf24Bit 图片......

而且,当然,因为它不是一个,而是每个像素 3 个字节,所以缺少因子 3:

TBitmap *Bitmap = new TBitmap();  
Bitmap->Width = pVih->bmiHeader.biWidth;              
Bitmap->Height = pVih->bmiHeader.biHeight;
Bitmap->PixelFormat=pf24bit;
for(int j=0;j<Bitmap->Height;j++){
    Byte *y=(Byte*)Bitmap->ScanLine[j];
    for(int x=0;x<Bitmap->Width*3;x++){
        y[x]=pBuffer[j*Bitmap->Width*3+x];
    }
}
Image1->Picture->Bitmap->Assign(Bitmap);

它仍然有点慢,但我想我无法直接访问位图中的颜色字节......

于 2012-08-20T17:44:28.290 回答