siedziałem, siedziałem i takie cuś zrobiłem:
var
dest, src:TRect;
Bitmap: TBitmap;
i,n: integer;
xparts, yparts,no: byte;
szer, wys: integer;
puzzle: array of TImage;
begin
szer := 40;
wys := 40;
bitmap := TBitmap.Create;
bitmap.LoadFromFile('c:\\obraz.bmp'); //ścieżke sobie wybierz
xparts := ceil(bitmap.Width / szer);
yparts := ceil(bitmap.Height / wys);
SetLength(puzzle, (xparts * yparts)+1);
dest := Rect(0, 0, szer, wys);
no := 0;
for n := 0 to yparts-1 do
begin
for i := 0 to xparts-1 do
begin
src := Rect(i*szer, n*wys, (i*szer)+szer, (n*wys)+wys);
Inc(no);
puzzle[no] := TImage.Create(form1);
puzzle[no].Canvas.CopyRect(dest, bitmap.Canvas, src);
puzzle[no].Picture.Bitmap.Height := wys;
puzzle[no].Picture.Bitmap.Width := szer;
// wyswietl sobie zeby sprawdzic :)
form1.InsertControl(puzzle[no]);
puzzle[no].Canvas.TextOut(1,1,inttostr(no));
puzzle[no].left := i*(szer+2);
puzzle[no].top := n*(wys+2);
end;
end;