我有一张图片(这是一张雪碧)。我将它存储在一个字节数组中。我想只提取与该字节数组中特定位置和大小相关的字节,这样我就可以创建一个新图像。基本上是一种作物。我正在使用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];
}
}
}
答案 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;
}
您需要知道每个像素的位数和宽度。您将使用一个而不是两个。