现在已知rgbBuf的是24位 1024×768的RGB矩阵,我用这样的算法 感觉很慢。有谁能优化一下吗?
Byte *ScanLine;
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Width = 1024;
Bmp->Height = 768;
Bmp->PixelFormat = pf24bit;
int index = 0;
for(int i=768;i>=0;i--)
{
ScanLine = static_cast<Byte*>(Bmp->ScanLine[i]);
for(int j=0; j <1024 * 3 ;j++)
{
ScanLine[j] = rgbBuf[index];
index ++;
}
}
Bmp->Canvas->Font->Name="Arial";
Bmp->Canvas->Font->Color =clWhite;
Bmp->Canvas->Font->Size =15;
Bmp->Canvas->Brush->Style = bsClear;
Bmp->Canvas->TextOutA(4,10,"file in process");
BITMAP bmp;
GetObject( Bmp->Handle ,sizeof(BITMAP),&bmp);
memcpy(rgbBuf,bmp.bmBits,size );
delete Bmp;
Byte *ScanLine;
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Width = 1024;
Bmp->Height = 768;
Bmp->PixelFormat = pf24bit;
int index = 0;
for(int i=768;i>=0;i--)
{
ScanLine = static_cast<Byte*>(Bmp->ScanLine[i]);
for(int j=0; j <1024 * 3 ;j++)
{
ScanLine[j] = rgbBuf[index];
index ++;
}
}
Bmp->Canvas->Font->Name="Arial";
Bmp->Canvas->Font->Color =clWhite;
Bmp->Canvas->Font->Size =15;
Bmp->Canvas->Brush->Style = bsClear;
Bmp->Canvas->TextOutA(4,10,"file in process");
BITMAP bmp;
GetObject( Bmp->Handle ,sizeof(BITMAP),&bmp);
memcpy(rgbBuf,bmp.bmBits,size );
delete Bmp;
ScanLine[j] = rgbBuf[index];
改成
memset(ScanLine, rgbBuf[index], 1024 * 3);
memcpy(ScanLine,rgbBuf, 1024 * 3);
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Width = 1024;
Bmp->Height = 768;
Bmp->PixelFormat = pf24bit;
int index = 0;
for(int i=768;i>=0;i--)
{
ScanLine = static_cast <Byte*>(Bmp->ScanLine[i]);
//for(int j=0; j <1024 * 3 ;j++)
//{
// ScanLine[j] = rgbBuf[index];
// index ++;
//}
memcpy(ScanLine[index],rgbBuf, 1024 * 3);
index += 1024 * 3;
}
Bmp->Canvas->Font->Name="Arial";
Bmp->Canvas->Font->Color =clWhite;
Bmp->Canvas->Font->Size =15;
Bmp->Canvas->Brush->Style = bsClear;
Bmp->Canvas->TextOutA(4,10,"file in process");
BITMAP bmp;
GetObject( Bmp->Handle ,sizeof(BITMAP),&bmp);
memcpy(rgbBuf,bmp.bmBits,size );
delete Bmp; 2.按机器字长
Byte *ScanLine;
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Width = 1024;
Bmp->Height = 768;
Bmp->PixelFormat = pf24bit;
int index = 0;
for(int i=768;i>=0;i--)
{
ScanLine = static_cast <Byte*>(Bmp->ScanLine[i]);
for(int j=0; j <1024 * 3 ;)
{
*((int *)&ScanLine[j]) = *((int *)&rgbBuf[index]);//这只是简单按机器字长来减小拷贝次数,实际上还可以通过sse指令优化
j += 4;
index += 4;;
}
}
Bmp->Canvas->Font->Name="Arial";
Bmp->Canvas->Font->Color =clWhite;
Bmp->Canvas->Font->Size =15;
Bmp->Canvas->Brush->Style = bsClear;
Bmp->Canvas->TextOutA(4,10,"file in process");
BITMAP bmp;
GetObject( Bmp->Handle ,sizeof(BITMAP),&bmp);
memcpy(rgbBuf,bmp.bmBits,size );
delete Bmp;
http://blog.csdn.net/housisong/archive/2007/07/27/1711153.aspx
不理解,rgbBuf 是矩阵,这样子从768到1 是不是 始终都是rgbBuf的前1024*3个字节了?
memcpy(ScanLine[index],rgbBuf, 1024 * 3);
编译提示 类型不对 Cannot convert 'int' to 'void *'
Bmp->Width = g_bbWidth/divv;
Bmp->Height = g_bbHeight/divv;
Bmp->PixelFormat = pf24bit; //24位位图 int index = 0;
for(int i=768;i>=0;i--)
{
ScanLine = static_cast<Byte*>(Bmp->ScanLine[i]);
//for(int j=0; j <1024* 3 ;j++)
//{
// ScanLine[j] = rgbBuf[index];
// index ++;
//}
memcpy(&ScanLine[index],rgbBuf, 1024* 3);
index += 1024* 3; }
Bmp->Canvas->Font->Name="Arial";
Bmp->Canvas->Font->Color =clWhite;
Bmp->Canvas->Font->Size =15;
Bmp->Canvas->Brush->Style = bsClear;
Bmp->Canvas->TextOutA(4,10,"www.infallsoft.com");
Bmp->SaveToFile("c:\\oo1.bmp");
BITMAP bmp;
GetObject( Bmp->Handle ,sizeof(BITMAP),&bmp);
memcpy(rgbBuf,bmp.bmBits,size );
delete Bmp;
执行时出错
index += 1024* 3;