Hi Andree,
ich habe Dir eine rotate-Funktion eingefügt. Bitte schau mal, ob die's tut. V0.2 ist jetzt oben und zum Download bereit.

Edit: Ich sehe gerade, die wolltest ja auch eine andere Spaltenreihenfolge. Hab ich noch schnell integriert.

@sast:
Das ist keine Komponente.
Ich benutze einfach die Canvas-Oberfläche des Formulars: (Für das Zeichnen)
Code:
procedure TForm1.img_rePaint;
var r   :Trect;
    I,J :Integer;
begin
  For I:=0 to 31 do
    For J:=0 to 31 do begin
      r.Left   := img_offset+i*10+1;
      r.Top    := img_offset+j*10+1;
      r.Right  := r.Left+9;
      r.Bottom := r.Top+9;
      
      if img_array[I,J] then
        Canvas.Brush.Color := clPurple
      else
        Canvas.Brush.Color := clWhite;

      Canvas.FillRect(r);
    end;

  Canvas.Pen.Color   := clLtGray;

  For I:=0 to 32 do begin
    canvas.MoveTo(img_offset,img_offset+i*10);
    canvas.LineTo(img_offset+32*10,img_offset+i*10);

    canvas.MoveTo(img_offset+i*10,img_offset);
    canvas.LineTo(img_offset+i*10,img_offset+32*10);
  end;

  Canvas.Brush.Color := Form1.Color;

  canvas.TextOut(img_offset,img_offset-15, '0');
  canvas.TextOut(img_offset-15,img_offset, '0');
  For I:=1 to 4 do begin
    canvas.TextOut(img_offset+10*I*8-10,img_offset-15, IntToStr(8*I-1));
    canvas.TextOut(img_offset-15,img_offset+10*I*8-10, IntToStr(8*I-1));
  end;

end;

Aufgerufen wird diese Funktion bei allen Aktionen, die den Datenbestand ändern, und beim Windows-Repaint-Signal (TForm1.FormPaint).

Zum Ändern der Pixel benutze ich folgende Funktion, die ich in die Ereignisse TForm1.FormMouseMove und TForm1.FormMouseUp eingefügt habe:
Code:
procedure TForm1.PaintItem(X,Y :Integer; mLeft,mRight :Boolean);
VAR iX, iY  :Integer;
    changed :Boolean;
begin
  iX := (X-img_offset) DIV 10;
  iY := (Y-img_offset) DIV 10;
  if (iX < 0) OR (iX > 31) OR (iY < 0) OR (iY > 31) THEN
    exit;

  StatusBar1.Panels[0].Text := '('+IntToStr(iX)+'|'+IntToStr(iY)+')';

  changed := False;

  IF mLeft THEN begin
    if not(img_array[iX,iY]) then
      changed := True;
    img_array[iX,iY] := True;
  end;

  IF mRight THEN begin
    if (img_array[iX,iY]) then
      changed := True;
    img_array[iX,iY] := False;
  end;

  if (changed) then
    list_recalc;

  img_rePaint;
end;
Wie Du siehst, wird hier auch das Neumalen wieder angestoßen. Ebenso wie das Neuberechnen der Liste.



Für alle Interessierten ist jetzt der Source zum Download verfügbar.