1

我有一个 jpeg 图像。我将此位图数据保存到字节数组中。

此 jpeg 的宽度为 100,高度为 100。

我想提取 Rectanlge(10,10,20,20) 的图像;

显然,我可以通过这个字节数组进行交互,但我不确定如何将我想要的 x、y 像素与这个字节数组相关联。我知道我必须使用 4 的步幅和像素大小,因为它是 rgba。

我有这个来自这个链接,用 C# 从 BitmapData 裁剪一个区域

Bitmap bmp = new Bitmap(_file);
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
 BitmapData rawOriginal = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);

int origByteCount = rawOriginal.Stride * rawOriginal.Height;
byte[] origBytes = new Byte[origByteCount];
System.Runtime.InteropServices.Marshal.Copy(rawOriginal.Scan0, origBytes, 0, origByteCount);

int BPP = 4;  
int width = 20;
int height = 20;
int startX = 10;
int startY = 10;

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

但是这个:

int origIndex = (startX * rawOriginal.Stride) + (i * rawOriginal.Stride) + (startY * BPP) + (j);

我发现是不正确的。

有谁知道我应该在这里设置什么值?

谢谢

4

2 回答 2

2

Stride是每行的字节数(Y),你不应该x在任何时候乘以Stride

int y = startY + i;
int x = startX;
int origIndex = y * rawOriginal.Stride + x * BPP;
于 2013-10-02T14:24:21.797 回答
2

处理位图数据时,需要牢记 2 件重要的事情:

  1. BPP(每像素字节数):这里是 4
  2. 步幅(图像的一行上的字节数),此处为 4 * 宽度

所以如果你想得到一个像素的偏移量,只需使用这个公式:

int offset = x * BPP + y * stride;

如果您只想提取位图的一部分,您可以这样做:

int i = 0;

for(int y = startY; y < startY + height; y++)
{
    for(int k = startX * bpp + y * stride; k < (startX + width) * bpp + y * stride; k++)
    {
        croppedBytes[i] = origBytes[k];
        i++;
    }
}
于 2013-10-02T14:28:46.133 回答