1

jpeg画像があります。このビットマップデータをバイト配列に保存します。

この jpeg の幅は 100、高さは 100 です。

Recttanlge(10,10,20,20); の画像を抽出したい。

明らかに、このバイト配列を介してやり取りできますが、必要な x、y ピクセルをこのバイト配列に関連付ける方法がわかりません。rgbaなので、4のストライドとピクセルサイズを使用する必要があることはわかっています。

これは、このリンクから BitmapData の領域を 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);

私は間違っていることがわかりました。

ここに設定する必要がある値を知っている人はいますか?

ありがとう

4

2 に答える 2

2

Strideは 1 行あたりのバイト数 (Y) ですxStride

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. ストライド (画像の 1 行のバイト数)、ここでは 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 に答える