Stworzenie bitmapy z kilku TImage

0

Cześć, na ScrollBox mam kilka TImage i trochę innych wizualnych komponentów.
Teraz chcę zrobić tak, żeby wszystkie TImage zapisały się do jednego pliku bmp. Chcę mieć po prostu plik wynikowy.

Napisałem sobie kod, który po mojemu powinien był zadziałać. Ale efektem jest całkiem biała bitmapa, o odpowiednich rozmiarach:

var
  bmp: TBitmap;
  c: TCanvas;
  i: integer;
  r: TRect;
begin
  c:=TCanvas.Create;
  c.Handle:=GetWindowDC(MainScrollBox.Handle);

//kopiuję wszystkie obiekty na canvas
  r:=Rect(0, 0, MainScrollBox.Width, MainScrollBox.Height);

  for i:=0 to Images.Count-1 do
      c.CopyRect(r, Images[i].Canvas, Images[i].ClientRect)


//potrzebuję zapisać tylko pewien obszar
  bmp:=TBitmap.Create;
  bmp.Height:=FImage.Height;
  bmp.Width:=FImage.Width;

  bmp.Canvas.CopyRect(Rect(0, 0, bmp.Width, bmp.Height), c, Rect(FImage.Left, FImage.Top, FImage.Width, FImage.Height));
  bmp.SaveToFile(FileName);

  FreeAndNil(bmp);
  FreeAndNil(c);
end;

Małe wyjąsnienie.
FImage - mam dla ułatwienia. Ten komponent ogranicza mi pole zapisu. Tzn. tylko to co jest na tym obszarze chcę zapisać do pliku. Oczywiście w tym obszarze mam obrazy.

Co tu jest nie tak?

0

Nie jestem pewien, czy o to dokładnie biega, ale można by to zrobić tak:

procedure TForm1.Button1Click(Sender: TObject);

Var
 bmp: TBitmap;
 FImage: record //rekord jako symulacja Twojego FImage, do usunięcia
           Left, Top, Width, Height: Integer;
         End;
 i: Integer;
begin
  bmp:=TBitmap.Create;
  try
    //-------- przykładowe ograniczenia obszaru do zapisu w bmp ------------
    FImage.Left:=60;
    FImage.Top:=60;
    FImage.Width:=MainScrollBox.Width-120;
    FImage.Height:=MainScrollBox.Height-120;
    //-------------------------------------------------------------
    bmp.Width:=FImage.Width;
    bmp.Height:=FImage.Height;
    //------- nadanie bitmapie koloru tła MainScrollBox-a -------
    bmp.Canvas.Brush.Assign(MainScrollBox.Brush);
    bmp.Canvas.FloodFill(0,0, clWhite, fsSurface);
    //------------ szukanie w MainScrollBox tylko TImage ----------
    For i:=0 to MainScrollBox.ControlCount-1 do
      If MainScrollBox.Controls[i] is TImage then
      Begin
        bmp.Canvas.StretchDraw(Rect((MainScrollBox.Controls[i] as TImage).Left-FImage.Left,
                                    (MainScrollBox.Controls[i] as TImage).Top-FImage.Top,
                                    (MainScrollBox.Controls[i] as TImage).Left-FImage.Left+(MainScrollBox.Controls[i] as TImage).Width,
                                    (MainScrollBox.Controls[i] as TImage).Top-FImage.Top+(MainScrollBox.Controls[i] as TImage).Height),
                               (MainScrollBox.Controls[i] as TImage).Picture.Graphic);
      End;
    bmp.SaveToFile('c:\Bitmapka.bmp');
  finally
    bmp.Free;
  end;
end; 

Pzdr.
Marogo

1 użytkowników online, w tym zalogowanych: 0, gości: 1