我有一个jpeg图片。我将这个bitmapdata保存为字节数组。
此jpeg的宽度为100,高度为100。
我想提取Rectanlge(10,10,20,20);
的图像显然,我可以通过这个字节数组进行交互,但我不确定如何将我想要的x,y像素与这个字节数组相关联。我知道我必须使用步幅和像素大小为4,因为它是rgba。
我有这个来自此链接cropping an area from BitmapData with C#。
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);
我发现不正确。
有谁知道我应该在这里设置什么价值?
感谢
答案 0 :(得分:1)
Stride
是每行字节数(Y),您不应该x
Stride
int y = startY + i;
int x = startX;
int origIndex = y * rawOriginal.Stride + x * BPP;
答案 1 :(得分:1)
当您使用位图数据时,请记住以下两个重要事项:
因此,如果您想获得像素的偏移量,请使用以下公式:
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++;
}
}