我有一个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。
的问候,
儒略
答案 0 :(得分: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);
它仍然有点慢,但我想我无法直接访问位图中的颜色字节......