2010-04-15 4 views
0

J'ai int width, height; et IntPtr data; qui vient d'un pointeur char * non signé non géré et je voudrais créer un bitmap pour montrer les données d'image dans une interface graphique. S'il vous plaît considérer, que width ne doit pas être un multiple de 4, je n'ai pas une "foulée" et mes données d'image est aligné en BGRA.Comment configurer un bitmap avec des données non gérées?

Le code suivant fonctionne:

byte[] pixels = new byte[4*width*height];  
System.Runtime.InteropServices.Marshal.Copy(data, pixels, 0, pixels.Length);  
var bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

for(int i=0; i<height; i++) { 
    for(int j=0; j<width; j++) { 
    int p = 4*(width*i + j); 
    bmp.SetPixel(j, i, Color.FromArgb(pixels[p+3], pixels[p+2], pixels[p+1], pixels[p+0])); 
    } 
} 

Y at-il une manière plus directe pour copier les données?

Répondre

1

Comme je l'ai compris, pixelformat Format32bppArgb utilise l'ordre BGRA demandé (malgré le nom) et stride doit être 0 dans ce cas. La réponse est simplement:

var bmp = new Bitmap(width, height, 0, System.Drawing.Imaging.PixelFormat.Format32bppArgb, data); 

Il convient de noter que Bitmap ne fait pas une copie des données, mais utilise le pointeur donné directement. Il ne faut donc pas libérer le pointeur de données dans le monde non géré, alors que le Bitmap l'utilise encore!

Questions connexes