2010-09-14 15 views
7

J'ai un objet 2208 x 3000 TransformedBitmap avec le format {Indexed8} que je fais .CopyPixels(). J'utiliseMalheurs 'Stride' d'un objet TransformedBitmap

(int)((formattedBitmap.PixelWidth * formattedBitmap.Format.BitsPerPixel + 7)/8) 

(en supposant « formattedBitmap » est le nom de l'image à partir de laquelle je suis en train de copier les pixels) pour la valeur « foulée » dans mon appel de méthode et un tableau d'octets qui est 2208 de longueur. J'ai quelque chose comme ça fonctionnant ailleurs dans le code (où le format de l'image est {Gray8}.) Cependant, là où j'essaye de faire la même chose sur l'image ci-dessus, je reçois continuellement un "Argument Out of Range" exception disant "La valeur du paramètre ne peut pas être inférieure à '6624000'. \ r \ nParameter name: buffer."

Mes questions à ce sujet sont les suivantes: pourquoi dans le monde exactement le même code semble-t-il fonctionner au même endroit et non pas l'autre? Qu'est-ce que dans le monde, en termes simples, est vraiment la «foulée» et comment puis-je obtenir l'effet désiré (de copier les bits) sans obtenir cette erreur? Que fais-je tort?

Toute aide à ce serait très apprécié.Merci beaucoup!

Répondre

9

Je l'ai compris (wow ... un peu ne peut pas croire que j'ai passé quelque chose près d'une heure à jouer avec ça!). Le problème était que le tableau d'octets doit être de taille

sourceImage.PixelHeight * stride 

int stride = (int)((sourceImage.PixelWidth * sourceImage.Format.BitsPerPixel + 7)/8); 

La raison pour laquelle il a travaillé dans l'autre endroit dans mon code est parce que plutôt que de copier les pixels pour l'image entière (comme j'essaye de faire où j'avais le problème), je copiais seulement les pixels d'une rangée simple ... c'est-à-dire, fondamentalement une région 2008 x 1, de sorte que la taille du tableau d'octets de destination puisse être exactement 2208 et cela fonctionnerait bien. Pour référence future, quelque chose comme ceci devrait probablement toujours être utilisé, plus ou moins:

int width = source.PixelWidth; 
int height = source.PixelHeight; 
int stride = width * ((source.Format.BitsPerPixel + 7)/8); 

byte[] bits = new byte[height * stride]; 

source.CopyPixels(bits, stride, 0); 

Cheers!

+4

Oh, et MSDN a un article assez décent sur ce qu'est une «foulée». Ce n'est certainement pas un terme de "profane" et je le trouve un peu convulsé, mais c'est une bonne référence (un seul que vous aurez besoin de lire plusieurs fois pour vraiment comprendre si vous êtes nouveau dans le traitement d'image en C# (comme je suis!)) LINK: http://msdn.microsoft.com/en-us/library/aa473780(VS.85).aspx – JToland

+0

Comme une personne qui a tendance à jeter un coup d'oeil sur le code (nous sommes tous pressés non?) J'ai vu votre calcul de foulée (le mauvais) et j'ai passé une demi-heure à essayer de le faire fonctionner avant de réaliser que vous aviez la formule correcte plus bas. Ce serait bien d'avoir la bonne formule en haut :) – Peter