2013-08-18 4 views
0

Je ne suis pas vraiment sûr de savoir si c'est une question vraiment évidente ou non. Ce que j'ai est une liste ordonnée d'octets qui représentent des pixels et des données de profondeur liées à ces pixels, donc quand ils sont retournés dans une boîte, ils créent une image. Ce que j'essaie de faire est d'isoler un plus petit rectangle de ces octets dans un nouveau tableau d'octets. Donc, fondamentalement, je veux passer une grande partie des octets au début du tableau (ceux qui sont complètement au-dessus de la section rectangle plus petit), ainsi que le premier lot à sa gauche, puis ajouter une rangée de la longueur de la petite boîte au nouveau tableau, puis sautez ceux qui se trouvent sur la droite de la boîte, passez le côté gauche sur la ligne suivante, ajoutez la longueur, passez la droite et répétez le tout jusqu'à la fin de la boîte. J'espère vraiment qu'une mauvaise explication a du sens pour quelqu'un. Je n'ai aucune idée de comment y arriver. Toute aide sera grandement appréciée!C# - Comment créer un nouveau tableau d'octets à partir d'une partie d'un tableau plus grand

Merci!

+0

Le tableau est-il multidimensionnel? Ou est-il contigu comme des données brutes en mémoire? –

+0

Ayant juste cherché ce qu'est un tableau multidimensionnel, c'est contigu. – user2693406

+0

Avez-vous exactement un octet par pixel, ou plusieurs? –

Répondre

2

L'option la plus simple est probablement de créer un tableau d'octets de la bonne taille, puis utilisez Array.Copy ou Buffer.BlockCopy - plusieurs fois, par les sons de celui-ci.

Je suppose que vous devrez appeler la méthode de copie une fois par ligne, en recherchant où commence la partie correspondante de la ligne, où commence la partie correspondante de la ligne dans les données cible. Je vais vous laisser le reste pour le moment maintenant vous avez l'idée de base - mais n'hésitez pas à demander plus de précisions. N'oubliez pas (dans vos calculs) que le numéro de ligne "cible" ne sera pas égal au numéro de ligne "source"! (Je pense qu'il est plus facile de boucler sur les numéros de ligne cible et ajouter un décalage par rapport ...)

+3

Voulez-vous dire 'System.Array.Copy()'? Je pense que 'System.arraycopy' est Java. Si la performance est un problème, d'après mon expérience, Buffer.BlockCopy() 'est plus rapide, mais nécessite un soin particulier pour obtenir les corrections d'octets correctes. – Rotem

+0

@Rotem quand il s'agit d'un octet [] il n'y a pas de "soin supplémentaire" nécessaire; mais sûr, pour un double [] vous devez garder à l'esprit la taille de l'élément –

+0

@Rotem Je n'ai pas pensé à la méthode 'Buffer.BlockCopy'. Il y a un thread ['Array.Copy' vs' Buffer.BlockCopy'] (http://stackoverflow.com/questions/1389821/array-copy-vs-buffer-blockcopy). –

1

Je pense qu'il ressemblerait à quelque chose comme ceci:

const int numberOfBytesPerPixel = ...; 

// input: original data 
int originalWidth = ...; 
int originalHeight = ...; 
byte[] original = ...; // should have the correct size and contain the data 

// input: desired position and size for cropping rectangle 
int cropOffsetToTheRight = ...; 
int cropOffsetDown = ...; 
int cropWidth = ...; 
int cropHeight = ...; 

// get the rectangle: 
byte[] crop = new byte[numberOfBytesPerPixel * cropWidth * cropHeight]; 
for (int rowNumber = 0; rowNumber < cropHeight; ++rowNumber) 
{ 
    Array.Copy(
     original, 
     numberOfBytesPerPixel * ((cropOffsetDown + rowNumber) * originalWidth + cropOffsetToTheRight), 
     crop, 
     numberOfBytesPerPixel * rowNumber, 
     numberOfBytesPerPixel * cropWidth 
     ); 
} 

Voici le doc pour the overload of Array.Copy used.

Questions connexes