从字节数组中裁剪图像

时间:2013-10-02 09:10:55

标签: bitmap bytearray

我有一张图片(这是一张雪碧)。我将它存储在一个字节数组中。我想只提取与该字节数组中特定位置和大小相关的字节,这样我就可以创建一个新图像。基本上是一种作物。我正在使用c#和compact cf.我可以使用get像素并将每个值保存到一个字节数组,然后“读取”我感兴趣的部分。我知道我可以使用lockbitmap来加快速度。我通常会使用Aforge和/或Emgu,但正如我所说我使用的是紧凑的cf框架2.

我会对任何已知的方法感兴趣。

由于

其他 在下面的链接中,我想知道这个迭代代码片段是否有替代方法(如缓冲区副本)?

//Iterate the selected area of the original image, and the full area of the new image
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width * BPP; j += BPP)
{
int origIndex = (startX * rawOriginal.Stride) + (i * rawOriginal.Stride) + (startY * BPP) + (j);
int croppedIndex = (i * width * BPP) + (j);

//copy data: once for each channel
for (int k = 0; k < BPP; k++)
{
croppedBytes[croppedIndex + k] = origBytes[origIndex + k];
}
}
}

2 个答案:

答案 0 :(得分:1)

我还有一些链接

如果您找到解决方案或以任何方式帮助您,请尝试

1)http://www.codeproject.com/Articles/33838/Image-Processing-using-C

2)http://codenicely.blogspot.in/2012/03/how-to-crop-image-in-c.html

答案 1 :(得分:1)

我知道这是一个老问题,但这是我的看法:

public static byte[] CropImageArray(byte[] pixels, int sourceWidth, int bitsPerPixel, Int32Rect rect)
{
    var blockSize = bitsPerPixel / 8;
    var outputPixels = new byte[rect.Width * rect.Height * blockSize];

    //Create the array of bytes.
    for (var line = 0; line <= rect.Height - 1; line++)
    {
        var sourceIndex = ((rect.Y + line) * sourceWidth + rect.X) * blockSize;
        var destinationIndex = line * rect.Width * blockSize;

        Array.Copy(pixels, sourceIndex, outputPixels, destinationIndex, rect.Width * blockSize);
    }

    return outputPixels;
}

您需要知道每个像素的位数和宽度。您将使用一个而不是两个。