1

画像データの切り出しが可能です。私が知っている場合:

byte[] ImageData;
int width;
int height;

基本的に、ソースから画像の内部セクションを取得する方法を見つけようとしますbyte[]

たとえば、w: 1000px と h: 600px の画像があります。そして、私はbyte[]中央セクション200 * 200pxが必要byte[]です。

4

2 に答える 2

2

まず、配列内の何バイトが1ピクセルを表すかを知る必要があります。以下は、ピクセルあたり3バイトのRGBイメージがあることを前提としています。

次に、カットアウトの左上隅を表す最初のバイトの配列インデックスは、次のように表されます。

int i = y * w + x

ここyで、はyカットアウトの-座標、はw画像全体の幅、はカットアウトの座標です。xx

次に、次のように実行できます。

// cw: The width of the cutout
// ch: The height of the cutout
// x1/y1: Top-left corner coordinates

byte[] cutout = new byte[cw * ch * 3]; // Byte array that takes the cutout bytes
for (int cy = y1; cy < y2; cy++)
{
    int i = cy * w + x1;
    int dest = (cy - y1) * cw * 3;
    Array.Copy(imagebytes, i, cutout, dest, cw * 3);
}

これは、切り取られる最初の行から最後の行まで繰り返されます。次に、でi、切り抜く必要のある画像の行の最初のバイトのインデックスを計算します。その中で、バイトがコピーされるべきdestインデックスを計算します。cutout

その後、現在の行のバイトをコピーしてcutout、指定された位置に切り取ります。

私はこのコードを実際にテストしていませんが、そのようなものは機能するはずです。また、現在範囲チェックが行われていないことに注意してください。カットアウトの位置と寸法が実際に画像の境界内にあることを確認する必要があります。

于 2012-12-13T08:32:20.900 に答える
0

最初に画像に変換できる場合は、Bytes.Comで見つけたこのコードを使用できます

次のコードは私のために働きます。.gifをロードし、gifの30 x 30セクションをオフスクリーンビットマップに描画してから、拡大縮小された画像を画像ボックスに描画します。

System.Drawing.Image img=... create the image from the bye array ....
Graphics g1 = pictureBox1.CreateGraphics();
g1.DrawImage(img, 0, 0, img.Width, img.Height);
g1.Dispose();

Graphics g3 = Graphics.FromImage(bmp);
g3.DrawImageUnscaled(img, 0, 0, bmp.Width, bmp.Height);

Graphics g2 = pictureBox2.CreateGraphics();
g2.DrawImageUnscaled(bmp, 0, 0, bmp.Width, bmp.Height);
g2.Dispose();

g3.Dispose();
img.Dispose();

この質問を使用して、byte []を画像に変換できます。配列を変更した後、c#でバイト配列を画像に変換します

于 2012-12-13T08:32:10.927 に答える