1

我有一个图像(它是一个 Sprite),我将它存储在一个字节数组中。

我只想提取与此字节数组中特定位置和大小相关的字节,以便创建新图像,基本上是裁剪。

我正在使用 C# 和紧凑的 cf。我可以使用获取像素并将每个值保存到一个字节数组中,然后“读取”我感兴趣的部分。我知道我可以用它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];
        }
    }
}
4

2 回答 2

2

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

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;
}

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

于 2020-06-23T17:26:17.560 回答
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

于 2013-10-02T09:44:49.730 回答