0

Byte*タイプのRGB-Byte-Informationの配列があります。
corona-libraryを使用してPNGファイルに保存できます。
しかし、毎回ファイルを保存してロードすることなく、なんとかしてBytearrayをTImage-Objectに表示したいと思います...
私はすでに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のXE216のC++Builderを使用しています。

よろしく、
ジュリアン

4

1 に答える 1

0

Hindsightでは、pf24Bit-pictureを受信して​​いることを通知する必要があったかもしれません...

そしてもちろん、1ピクセルあたり1バイトではなく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 に答える