2014-05-25 3 views
1

Je suis en train de créer Bitmap de tableau d'octets en utilisant ce code:Bitmap du tableau d'octets changement

var b = new Bitmap(pervoe, vtoroe, System.Drawing.Imaging.PixelFormat.Format8bppIndexed); 
ColorPalette ncp = b.Palette; 
for (int i = 0; i < 256; i++) 
    ncp.Entries[i] = System.Drawing.Color.FromArgb(255, i, i, i); 

b.Palette = ncp; 

var BoundsRect = new Rectangle(0, 0, Width, Height); 

BitmapData bmpData = b.LockBits(BoundsRect,ImageLockMode.WriteOnly,b.PixelFormat); 

IntPtr ptr = bmpData.Scan0; 

int bytes = (bmpData.Stride)*(b.Height); 
     var rgbValues = new byte[bytes]; 
// filling values 

Marshal.Copy(rgbValues, 0, ptr, bytes); 

b.UnlockBits(bmpData); 
     return b; 

le problème est que quand je reçois l'image de sortie chaque ligne à partir de la première est décalée vers la droite donc l'image entière ne regarde pas bien. Le problème n'est pas dans le rgbValues ​​- J'ai essayé de l'utiliser avec la méthode setPixel et cela fonctionne parfaitement. Toute aide avec classe marshal ou que dois-je faire pour éviter ce déplacement?

Répondre

1

Le code que vous montrez semble correct et devrait fonctionner comme prévu. Le problème est probablement lié à la façon dont vous avez implémenté la pièce // filling values. Ma conjecture est que la largeur de votre image est telle que bmpData.Stride != b.Width (et donc bytes != Width * Height) mais vous ne comptez pas pour cela et remplissez le premier Width * Height octets du tableau rgbValues. Pour des raisons d'optimalisation, l'implémentation Bitmap peut choisir d'ajouter des octets de remplissage à chaque ligne de données d'image qui ne font pas réellement partie de l'image. Si c'est le cas, vous devez en tenir compte et écrire vos données d'image sur les Width premiers octets de chaque ligne, où chaque ligne commence à l'index rowIndex * BitmapData.Stride.

Vous devez donc remplir votre tampon le long des lignes de:

for (int row = 0; row < b.Height; ++row) 
{ 
    int rowStart = row * bmpData.Stride; 
    for (int column = 0; column < b.Width; ++column) 
    { 
     rgbValues[rowStart + column] = GetColorForPixel(column, row); 
    } 
} 
+0

Merci !!! alooooooottt c'était la particularité que je ne connaissais pas. Tout fonctionne bien maintenant! – user3556034

+0

De rien. Veuillez accepter (http://stackoverflow.com/help/accepted-answer) la réponse si vous le jugez correct :-) –

Questions connexes