现在已知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;

解决方案 »

  1.   

    能否直接用memset来赋值呢?
    ScanLine[j]  =  rgbBuf[index];
    改成
    memset(ScanLine, rgbBuf[index], 1024  *  3);
      

  2.   

    注意index++;
    memcpy(ScanLine,rgbBuf, 1024 * 3);
      

  3.   

    1.memcpy      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  ++; 
              //} 
              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; 
      

  4.   

    使用memcpy依赖于CRT库的优化,兼容性会好很多,比如64位里面如果有做优化每次复制8字节的话,那比你直接写上每次4字节,明显要减少一半的指令时间.
      

  5.   

    关于内存拷贝等的优化,可以大概地参考一下:
    http://blog.csdn.net/housisong/archive/2007/07/27/1711153.aspx
      

  6.   

    memcpy(ScanLine[index],rgbBuf, 1024 * 3);
    不理解,rgbBuf 是矩阵,这样子从768到1 是不是 始终都是rgbBuf的前1024*3个字节了?
      

  7.   

    rgbBuf 的大小是1024*768*3
    memcpy(ScanLine[index],rgbBuf, 1024 * 3); 
    编译提示 类型不对 Cannot convert 'int' to 'void *'
      

  8.   

    memcpy(&ScanLine[index],rgbBuf, 1024 * 3); 
      

  9.   

          Byte   *ScanLine;      Graphics::TBitmap   *Bmp   =   new   Graphics::TBitmap();
          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;
    执行时出错
      

  10.   

              memcpy(ScanLine,&rgbBuf[Index], 1024* 3); 
              index += 1024* 3;