2016-01-10 1 views
0
public byte[] CropImage(byte[] bmp, Rectangle cropSize, int stride) 
{ 
    //make a new byte array the size of the area of cropped image 
    int totalSize = cropSize.Width * 3 * cropSize.Height; 
    int totalLength = bmp.Length; 
    int startingPoint = (stride * cropSize.Y) + cropSize.X * 3; 
    byte[] croppedImg = new byte[totalSize]; 

    //for the total size of the old array 
    for(int y = 0; y<totalLength; y+= stride) 
    { 
     //copy a row of pixels from bmp to croppedImg 
     Array.Copy(bmp, startingPoint + y, croppedImg, y, cropSize.Width*3);    
    } 

    return croppedImg; 
} 

Array.Copy пропускается и не копируется.C# копирование байтовой матрицы пропускается через

Я думал, что я ошибся, но даже при копировании каждого байта вручную он делает то же самое.

Эта функция принимает необработанный массив байтов изображений BGR [] и обрезает его на основе Rect (x, y, width, height).

И наконец, возвращая отрезанный массив байтов к основной функции.

+0

Что означает «пропущен»? Пробовали ли вы установить контрольные точки, пройти через код и проверить свои переменные? – CodeCaster

+0

Проблема, скорее всего, связана с логикой копирования изображений, а не с 'Array.Copy'. Что представляет параметр 'stride'? –

+0

Кроме того, почему вы делаете эту логику вручную? Я почти уверен, что в рамках платформы .NET есть API-интерфейсы для выполнения этой работы. –

ответ

1

Здесь

for(int y = 0; y<totalLength; y+= stride) 
{ 
    //copy a row of pixels from bmp to croppedImg 
    Array.Copy(bmp, startingPoint + y, croppedImg, y, cropSize.Width*3);    
} 

вы передаете y к Array.Copy метод аргумент, который, как предполагается, будет destinationIndex, что не верно в вашем случае.

Во избежание таких ошибок используйте лучшие имена для своих переменных (и используйте больше переменных, они дешевы). Например, код может быть таким:

public byte[] CropImage(byte[] source, Rectangle cropRect, int sourceStride) 
{ 
    int targetStride = cropRect.Width * 3; 
    var target = new byte[cropRect.Height * targetStride]; 
    int sourcePos = cropRect.Y * sourceStride + cropRect.X * 3; 
    int targetPos = 0; 
    for (int i = 0; i < cropRect.Height; i++) 
    { 
     Array.Copy(source, sourcePos, target, targetPos, targetStride); 
     sourcePos += sourceStride; 
     targetPos += targetStride; 
    } 
    return target; 
} 
+0

Я не могу поверить Я пропустил это. Вы правы targetPos должны увеличиваться на targetStride, не он sourceStride. Спасибо! – sprites