2010-12-10 91 views
1

J'essaie de manipuler une image, je suis assez nouveau en ce qui concerne les bitmaps et les images si nues avec mon sur mes questions et mon code. J'initialise un tableau d'octets pour contenir les données de pixels Bgr24 afin que je puisse le transmettre dans un objet BitmapSource. Mais mon tableau de pixels n'est pas la taille correcte "je pense".J'ai des problèmes avec l'objet BitmapSource en C#

La dernière ligne de code est en fait où mon problème est, le paramètre "pixels" me jette l'erreur suivante "System.ArgumentException was unshandled La valeur ne tombe pas dans la fourchette attendue."

J'initialize ces variables

int imageSize = 100; 
double dpi = 96; 
int width = 128; 
int height = 128; 
byte[] pixels = new byte[width * height * 3]; 

//Create my image.... 

for (int i = 0; i < imageSize; i++) 
{ 
    for (int j = 0; j < imageSize; j++) 
      { 
       int ct = myImage[i, j]; 

       pixels[i * imageSize * 3 + j + 0] = (byte)((ct % 16) * 14); 
       pixels[i * imageSize * 3 + j + 1] = (byte)((ct % 32) * 7); 
       pixels[i * imageSize * 3 + j + 2] = (byte)((ct % 128) * 2); 

      } 
}//end for 

     //Create the bitmap 
     BitmapSource bmpSource = BitmapSource.Create(width, height, dpi, dpi, PixelFormats.Bgr24, null, pixels, width); 

Je comprends que je ne suis pas correctement réglé le tableau pixels. Des pensées?

+0

Qu'est-ce 'imageSize' et pourquoi utilisez-vous qu'au lieu de' 'width' et height'? –

+0

Je l'ai ajouté, manqué dans mon copier/coller initial. imageSize = 100; –

+0

Je suppose que vos maths sont incorrectes. Considérons ce que '[i * imageSize * 3 + j + 1]' est égal à pour toute combinaison particulière de 'i' /' j'. Considérons ensuite ce que '[i * imageSize * 3 + j + 0]' est égal à quand 'j' est un plus haut. –

Répondre

3

« Valeur ne tombe pas dans la plage attendue » est le message pour le ArgumentException que HRESULT.Check lancers francs lorsqu'une fonction WIC (natif Fonctionnalité d'imagerie WPF sous-jacente de l'API) renvoie WINCODEC_ERR_INVALIDPARAMETER.

Dans ce cas, le problème est que le paramètre final à BitmapSource.Create devrait être la "foulée" de la bitmap (pas la largeur). La "stride" d'un bitmap est le nombre (entier) d'octets requis pour stocker chaque ligne du bitmap. Selon this MSDN magazine article, la formule générale pour le calcul de la foulée est stride = (width * bitsPerPixel + 7)/8;. Pour un bitmap 24bpp, cela simplifie à width * 3.

Pour éviter l'exception, passer la valeur de pas correcte:

BitmapSource bmpSource = BitmapSource.Create(width, height, dpi, dpi, PixelFormats.Bgr24, null, pixels, width * 3); 
1

Voici un code que j'utilise lorsque vous travaillez avec bitmaps ...

private const int cRedOffset = 0; 
private const int cGreenOffset = 1; 
private const int cBlueOffset = 2; 
private const int cAlphaOffset = 3; 

var width = bmp.Width; 
var height = bmp.Height; 
var data = bmp.LockBits(Rectangle.FromLTRB(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); 
var stride = data.Stride; 
var pixels = new byte[height * stride]; 

Marshal.Copy(data.Scan0, pixels, 0, height * stride); 

for (var row = 0; row < height; row++) 
{ 
    for (var col = 0; col < width; col++) 
    { 
     var pixel = (row * stride) + (col * 4); 
     var red = pixels[pixel + cRedOffset]; 
     var green = pixels[pixel + cGreenOffset]; 
     var blue = pixels[pixel + cBlueOffset]; 
     var alpha = pixels[pixel + cAlphaOffset]; 
    } 
}