0

そこで、画像を取得してタイルに分割するプログラムを C# で作成しています。大きな画像を取り、それを異なるタイルに切り刻み、各タイルを保存したいところです。私が抱えている問題は、最初のタイルでは機能しますが、他のすべてのタイルが空白であり、その理由がわかりません. ここに私がチョッピングをしているコードがあります。

Graphics g;
Image tempTile;
TextureBrush textureBrush;
int currRow = 1;
int currCol = 1;
int currX = 0; //Used for splitting. Initialized to origin x.
int currY = 0; //Used for splitting. Initialized to origin y.

//Sample our new image
textureBrush = new TextureBrush(myChopImage);

while (currY < myChopImage.Height)
{
    while (currX < myChopImage.Width)
    {
        //Create a single tile
        tempTile = new Bitmap(myTileWidth, myTileHeight);
        g = Graphics.FromImage(tempTile);

        //Fill our single tile with a portion of the chop image
        g.FillRectangle(textureBrush, new Rectangle(currX, currY, myTileWidth, myTileHeight));

        tempTile.Save("tile_" + currCol + "_" + currRow + ".bmp");

        currCol++;
        currX += myTileWidth;

        g.Dispose();
   }

   //Reset the current column to start over on the next row.
   currCol = 1;
   currX = 0;

   currRow++;
   currY += myTileHeight;
}
4

2 に答える 2

1

空白のタイルがある理由は、次の行です。

g.FillRectangle(textureBrush, new Rectangle(currX, currY, myTileWidth, myTileHeight));

座標currX, currYは、タイル上の描画を開始する場所を指定します。ループの最初の繰り返しの後、これらの値はタイルの境界の外にあります。

より良い方法は、次を使用して画像をトリミングすることです。Bitmap.Clone

while (currY < myChopImage.Height)
{
    while (currX < myChopImage.Width)
    {
        tempTile = crop(myChopImage, new Rectangle(currX, currY, myTileWidth, myTileHeight));
        tempTile.Save("tile_" + currCol + "_" + currRow + ".bmp");

        currCol++;
        currX += myTileWidth;
   }

   //Reset the current column to start over on the next row.
   currCol = 1;
   currX = 0;

   currRow++;
   currY += myTileHeight;
}

トリミング方法は次のようになります。

private Bitmap crop(Bitmap bmp, Rectangle cropArea)
{
   Bitmap bmpCrop = bmp.Clone(cropArea, bmp.PixelFormat);
   return bmpCrop;
}
于 2013-02-15T19:14:54.407 に答える
0

あなたの場合:

    g.FillRectangle(textureBrush, new Rectangle(currX, currY, myTileWidth, myTileHeight));

呼び出しは、その範囲外の座標を埋めようとしていますか?

たとえば、タイルは 10x10 で、最初の呼び出し: g.FillRectangle(textureBrush, new Rectangle(0, 0, 10, 10));

そして2回目の電話で、あなたは効果的にやっています

    g.FillRectangle(textureBrush, new Rectangle(10, 0, 10, 10));

tempTile の範囲外にあるのはどれですか?

そのfillRectangle呼び出しは常に である必要があります0,0,myTileWidth,myTileHeight。これは、変更する のソースの場所textureBrushです。翻訳変換を使用して反対方向に翻訳する可能性がありますか?

于 2013-02-15T19:04:06.950 に答える