• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 220
  • Last Modified:

Splitting a bmp into small pieces

Hi there,
I need a code example of how to split a bmp into small pieces. My problem:

I have a large bmp with tiles on it (for use in a tiled based game) only, it's like 14tiles x 30tiles in size. A tile is 48x48 and there is a 3 pixel sperater around the tiles, ie....

------------------
|    ||    ||    |
|    ||    ||    |
------------------

Kinda like that. I need to know how i can load a bmp up and have eg:

Tile height: ??
Tile width: ??
Skip width: ??
Skip height: ??

The values would be (for my purpose):
48,48,3,3

If anyone can help me, please do so.

Thanks
Stephen
0
St3v13
Asked:
St3v13
  • 2
1 Solution
 
St3v13Author Commented:
Btw, the program will then spit out seperate bmps of the sperate tiles.

Thanks
Stephen
0
 
kretzschmarCommented:
sorry had no time to code, but its not so heavy to solve

the heart, beside the calculation is the bitmap.canvas.copyrect-method
or as alternative the bitblt-api funtion
to copy a part from the source bitmap into the new one

meikl ;-)
0
 
bugrogerCommented:
Hi,
 Try this code:

Type
 TXYWH     = Record
              x, y, w, h : integer;
             End;
 TTileXY   = array of TXYWH;


//Calc the XYPos in the Source-Bitmap and
//the width, height
//SkipL/R/T/B are Left, Right, Top, Bottom
Procedure CalcTileXY(VAR _TileXY : TTileXY;
                     horzCount, vertCount, TileHeight, TileWidth,
                     SkipL, SkipR, SkipT, SkipB : Integer);
VAR
 x, y, i : integer;

Begin
 SetLength(_TileXY, horzCount * vertCount);
 i := 0;
 For y := 0 to (vertCount -1) do
  For x := 0 to (horzCount -1) do
  Begin
   _TileXY[i].x := (x * TileWidth) + SkipL;
   _TileXY[i].y := (y * TileHeight) + SkipT;
   _TileXY[i].w := TileWidth - (SkipL + SkipR);
   _TileXY[i].h := TileHeight - (SkipT + SkipB);
   Inc(i);
  End;
End;

// TileNo from 1 to ...
Procedure GetTileBitmap(SourceBitmap : TBitmap; VAR DestBitmap : TBitmap;
                       _TileXY : TTileXY; TileNo : Cardinal);
Begin
 Dec(TileNo);
 DestBitmap.Canvas.CopyRect(
  Rect(0,0, _TileXY[TileNo].w , _TileXY[TileNo].h ),
  SourceBitmap.Canvas,
  Rect(_TileXY[TileNo].x, _TileXY[TileNo].y,
       _TileXY[TileNo].x + _TileXY[TileNo].w,
       _TileXY[TileNo].y + _TileXY[TileNo].h));
End;


Procedure DestroyTileXY(VAR _TileXY : TTileXY);
Begin
 SetLength(_TileXY, 0);
End;

-----------------------------------
example how to use these functions:
-----------------------------------

VAR
 TileXY : TTileXY;
 TileBitmap : TBitmap;

begin
 CalcTileXY(TileXY, 5, 5, 50, 50, 1, 1, 1, 1);
 TileBitmap := TBitmap.Create;
 TileBitmap.Width := TileXY[0].w;
 TileBitmap.height := TileXY[0].h;
 GetTileBitmap(Image1.Picture.Bitmap, TileBitmap, TileXY, StrToInt(Edit1.Text));
 Image2.Canvas.Draw(0,0, TileBitmap);
 DestroyTileXY(TileXY);
 TileBitmap.Free;
end;


GL
 Bug
0
 
St3v13Author Commented:
Excellent answer! Thanks so much for your time and effort. I hope these 195 points are enough :-)


Regards
Stephen
0

Featured Post

Receive 1:1 tech help

Solve your biggest tech problems alongside global tech experts with 1:1 help.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now