2011-10-02 86 views
1

有没有一种最快的方式来将Allegro 5.0.x中的IplImage类型从OpenCV转换为ALLEGRO_BITMAP类型,而不是将每个像素从一个转换为另一个?如何将IplImage(OpenCV)快速转换为ALLEGRO_BITMAP(A5)?

像2这样的循环:

void iplImageToBitmap(IplImage *source, ALLEGRO_BITMAP* dest) { 
    if(source!= NULL && dest!= NULL) { 
     al_set_target_bitmap(dest); 
     int height = source->height; 
     int width = source->width; 
     int x,y; 

     for(y=0; y < height ; y++) { 
      uchar* ptr = (uchar*) (
       source->imageData + y * source->widthStep 
       ); 
      for(x=0; x < width; x++) { 
       al_put_pixel(x,y,al_map_rgb(ptr[3*x+2],ptr[3*x+1],ptr[3*x])); 
      } 
     } 
    } 
} 

回答

2

使用al_lock_bitmap得到一个ALLEGRO_LOCKED_REGION,然后设置像素数据的描述。然后用al_unlock_bitmap解锁它。

+0

好吧,它运行得更好,但它是唯一的方法吗?它是因为这里的位图结构无法访问?这足够快吗?我不知道OpenCV可以执行这样的事情有多快。 – Merovigiam

+0

@Merovigiam:这些是Allegro提供的工具。 Allegro用于每帧更新图像。如果您想在此获得最佳性能,那么您需要比Allegro允许的级别更低。 –

+0

@Merovigiam,如果你以与源相同的格式来锁定位图,那么你可以一行一行地“memcpy”。如果这些行的宽度相同(即跨度或间距)并且是连续的,那么您也可以一次使用'memcpy'对整个事物进行处理。 – Matthew