unit ads_BitmapCombine; {ads_BitmapCombine
Copyright(c)2001 Advanced Delphi Systems (Richard Maley,12613 Maidens Bower Drive, Potomac, MD 20854 USA, phone 301-840-1554, maley@advdelphisys.com, http://www.advdelphisys.com/)

The code herein can be used or modified by anyone. Please retain references to Dick Maley at Advanced Delphi Systems. If you make improvements to the code please send your improvements to maley@advdelphisys.com so that the entire Delphi community can benefit. All comments are welcome.

}

interface
Uses
  Windows, Graphics;

//*****************************

Function BitmapCombineHoriz(
  BitmapLeft      : TBitmap;
  BitmapRight     : TBitmap;
  BitmapNew       : TBitmap
  ): Boolean; OverLoad;

Function BitmapCombineHoriz(
  BitmapFileLeft  : String;
  BitmapFileRight : String;
  BitmapFileNew   : String
  ): Boolean; OverLoad;

Function BitmapCombineHoriz(
  BitmapFileLeft  : String;
  BitmapFileRight : String;
  BitmapRightLeft : Integer;
  BitmapFileNew   : String
  ): Boolean; OverLoad;

Function BitmapCombineHoriz(
  BitmapLeft      : TBitmap;
  BitmapRight     : TBitmap;
  BitmapRightLeft : Integer;
  BitmapNew       : TBitmap
  ): Boolean; OverLoad;

//*****************************

Function BitmapCombineVert(
  BitmapTop        : TBitmap;
  BitmapBottom     : TBitmap;
  BitmapNew        : TBitmap
  ): Boolean; OverLoad;

Function BitmapCombineVert(
  BitmapTop       : TBitmap;
  BitmapBottom    : TBitmap;
  BitmapBottomTop : Integer;
  BitmapNew       : TBitmap
  ): Boolean; OverLoad;

Function BitmapCombineVert(
  BitmapFileTop   : String;
  BitmapFileBottom: String;
  BitmapBottomTop : Integer;
  BitmapFileNew   : String
  ): Boolean; OverLoad;

Function BitmapCombineVert(
  BitmapFileTop   : String;
  BitmapFileBottom: String;
  BitmapFileNew   : String
  ): Boolean; OverLoad;

//*****************************

Function BitmapCombine(
  BackgroundColor : TColor;
  BitmapBack      : TBitmap;
  BitmapBackRect  : TRect;
  BitmapFront     : TBitmap;
  BitmapFrontRect : TRect;
  BitmapNewHeight : Integer;
  BitmapNewWidth  : Integer;
  BitmapOut       : TBitmap
  ): Boolean;

implementation

Uses ads_BitmapResize, Types, SysUtils;

Function BitmapCombine(
  BackgroundColor : TColor;
  BitmapBack      : TBitmap;
  BitmapBackRect  : TRect;
  BitmapFront     : TBitmap;
  BitmapFrontRect : TRect;
  BitmapNewHeight : Integer;
  BitmapNewWidth  : Integer;
  BitmapOut       : TBitmap
  ): Boolean;
Var
  BitmapNew       : TBitmap;
  BitmapNewRect   : TRect;
  BitmapBK        : TBitmap;
  BitmapFT        : TBitmap;
  NewHeight       : Integer;
  NewWidth        : Integer;
  boRetValBK      : Boolean;
  boRetValFT      : Boolean;
Begin
  Result          := False;
  If BitmapBack  = nil Then Exit;
  If BitmapFront = nil Then Exit;
  Try
    BitmapNew     := TBitmap.Create();
    BitmapBK      := TBitmap.Create();
    BitmapFT      := TBitmap.Create();
    Try
      boRetValBK  := True;
      BitmapBK.Assign(BitmapBack);
      NewHeight   := BitmapBackRect.Bottom-BitmapBackRect.Top;
      NewWidth    := BitmapBackRect.Right-BitmapBackRect.Left;
      If
      (BitmapBK.Width  <> NewWidth)
      And
      (BitmapBK.Height <> NewHeight)
      Then
      Begin
        boRetValBK :=
          BitmapResize(
            BitmapBK     , //Bitmap       : TBitmap;
            NewHeight    , //NewHeight    : Integer;
            NewWidth     );//NewWidth     : Integer): Boolean; Overload;
      End;
      If Not boRetValBK Then Exit;
      
      boRetValFT  := True;
      BitmapFT.Assign(BitmapFront);
      NewHeight   := BitmapFrontRect.Bottom-BitmapFrontRect.Top;
      NewWidth    := BitmapFrontRect.Right-BitmapFrontRect.Left;
      If
      (BitmapFT.Width  <> NewWidth)
      And
      (BitmapFT.Height <> NewHeight)
      Then
      Begin
        boRetValFT :=
          BitmapResize(
            BitmapFT     , //Bitmap       : TBitmap;
            NewHeight    , //NewHeight    : Integer;
            NewWidth     );//NewWidth     : Integer): Boolean; Overload;
      End;
      If Not boRetValFT Then Exit;
      BitmapNewRect.Right := BitmapNewWidth-1;
      BitmapNewRect.Top   := 0;
      BitmapNewRect.Left  := 0;
      BitmapNewRect.Bottom:= BitmapNewHeight-1;
      BitmapNew.Width  := BitmapNewWidth;
      BitmapNew.Height := BitmapNewHeight;
      BitmapNew.Palette:= BitmapBack.Palette;
      BitmapNew.Canvas.Brush.Color := BackgroundColor;
      BitmapNew.Canvas.FloodFill(0,0,clBlack,fsBorder);
      BitmapNew.
        Canvas.
          Copyrect(
            BitmapBackRect,
            BitmapBK.Canvas,
            Rect(0,
                 0,
                 BitmapBK.Width,
                 BitmapBK.Height));

      BitmapNew.
        Canvas.
          Copyrect(
            BitmapFrontRect,
            BitmapFT.Canvas,
            Rect(0,
                 0,
                 BitmapFT.Width,
                 BitmapFT.Height));
      BitmapOut.Width  := BitmapNew.Width;
      BitmapOut.Height := BitmapNew.Height;
      BitmapOut.Palette:= BitmapNew.Palette;
      BitmapOut.
        Canvas.
          Copyrect(
            Rect(0,
                 0,
                 BitmapNew.Width,
                 BitmapNew.Height),
            BitmapNew.Canvas,
            Rect(0,
                 0,
                 BitmapNew.Width,
                 BitmapNew.Height));
      Result      := True;
    Finally
      BitmapNew   .Free;
      BitmapBK    .Free;
      BitmapFT    .Free;
    End;
  Except
    Result := False;
  End;
End;

//*****************************

Function BitmapCombineHoriz(
  BitmapLeft      : TBitmap;
  BitmapRight     : TBitmap;
  BitmapNew       : TBitmap
  ): Boolean; OverLoad;
Var
  BitmapRightLeft  : Integer;
Begin
  BitmapRightLeft  := BitmapLeft.Width+1;
  Result :=
    BitmapCombineHoriz(
      BitmapLeft      , //BitmapLeft      : TBitmap;
      BitmapRight     , //BitmapRight     : TBitmap;
      BitmapRightLeft , //BitmapRightLeft : Integer;
      BitmapNew         //BitmapNew       : TBitmap
                      );//): Boolean; OverLoad;
End;

Function BitmapCombineHoriz(
  BitmapLeft      : TBitmap;
  BitmapRight     : TBitmap;
  BitmapRightLeft : Integer;
  BitmapNew       : TBitmap
  ): Boolean; OverLoad;
Var
  BackgroundColor : TColor;
  BitmapBackRect  : TRect;
  BitmapFrontRect : TRect;
  BitmapNewHeight : Integer;
  BitmapNewWidth  : Integer;
Begin
    BackgroundColor := clWhite;
    BitmapBackRect  := Rect(0,0,BitmapLeft.Width,BitmapLeft.Height);
    BitmapFrontRect := Rect(BitmapRightLeft,0,BitmapRightLeft+BitmapRight.Width,BitmapRight.Height);
    If BitmapLeft.Height >= BitmapRight.Height Then
    Begin
      BitmapNewHeight := BitmapLeft.Height;
    End
    Else
    Begin
      BitmapNewHeight := BitmapRight.Height;
    End;
    BitmapNewWidth  := BitmapRightLeft+BitmapRight.Width;   
    Result :=
      BitmapCombine(
        BackgroundColor , //BackgroundColor : TColor;
        BitmapLeft      , //BitmapBack      : TBitmap;
        BitmapBackRect  , //BitmapBackRect  : TRect;
        BitmapRight     , //BitmapFront     : TBitmap;
        BitmapFrontRect , //BitmapFrontRect : TRect;
        BitmapNewHeight , //BitmapNewHeight : Integer;
        BitmapNewWidth  , //BitmapNewWidth  : Integer;
        BitmapNew         //BitmapOut       : TBitmap
                        );//): Boolean;
End;

Function BitmapCombineHoriz(
  BitmapFileLeft  : String;
  BitmapFileRight : String;
  BitmapRightLeft : Integer;
  BitmapFileNew   : String
  ): Boolean; OverLoad;
Var
  BitmapLeft      : TBitmap;
  BitmapRight     : TBitmap;
  BitmapNew       : TBitmap;
Begin
  Result          := False;
  If Not FileExists(BitmapFileLeft)  Then Exit;
  If Not FileExists(BitmapFileRight) Then Exit;
  BitmapLeft      := TBitmap.Create();
  BitmapRight     := TBitmap.Create();
  BitmapNew       := TBitmap.Create();
  Try
    BitmapLeft.LoadFromFile(BitmapFileLeft);
    BitmapRight.LoadFromFile(BitmapFileRight);
    Result :=
      BitmapCombineHoriz(
        BitmapLeft      , //BitmapLeft      : TBitmap;
        BitmapRight     , //BitmapRight     : TBitmap;
        BitmapRightLeft , //BitmapRightLeft : Integer;
        BitmapNew         //BitmapNew       : TBitmap
                        );//): Boolean; OverLoad;
    If Result Then
    Begin
      Try
        If FileExists(BitmapFileNew) Then DeleteFile(BitmapFileNew);
        BitmapNew.SaveToFile(BitmapFileNew);
      Except
        Result := False;
      End;
    End;
  Finally
    BitmapLeft    .Free;
    BitmapRight   .Free;
    BitmapNew     .Free;
  End;
End;

Function BitmapCombineHoriz(
  BitmapFileLeft  : String;
  BitmapFileRight : String;
  BitmapFileNew   : String
  ): Boolean; OverLoad;
Var
  BitmapRightLeft : Integer;
  BitmapLeft      : TBitmap;
Begin
  Result          := False;
  If Not FileExists(BitmapFileLeft)  Then Exit;
  If Not FileExists(BitmapFileRight) Then Exit;
  BitmapLeft      := TBitmap.Create();
  Try
    BitmapLeft.LoadFromFile(BitmapFileLeft);
    BitmapRightLeft := BitmapLeft.Width;
  Finally
    BitmapLeft.Free;
  End;
  Result :=
    BitmapCombineHoriz(
      BitmapFileLeft  , //BitmapFileLeft  : String;
      BitmapFileRight , //BitmapFileRight : String;
      BitmapRightLeft , //BitmapRightLeft : Integer;
      BitmapFileNew     //BitmapFileNew   : String
                      );//): Boolean; OverLoad;
End;

//*****************************

Function BitmapCombineVert(
  BitmapTop        : TBitmap;
  BitmapBottom     : TBitmap;
  BitmapNew        : TBitmap
  ): Boolean; OverLoad;
Var
  BitmapBottomTop  : Integer;
Begin
  BitmapBottomTop  := BitmapTop.Height+1;
  Result :=
    BitmapCombineVert(
      BitmapTop       , //BitmapLeft      : TBitmap;
      BitmapBottom    , //BitmapRight     : TBitmap;
      BitmapBottomTop , //BitmapRightLeft : Integer;
      BitmapNew         //BitmapNew       : TBitmap
                      );//): Boolean; OverLoad;
End;

Function BitmapCombineVert(
  BitmapTop       : TBitmap;
  BitmapBottom    : TBitmap;
  BitmapBottomTop : Integer;
  BitmapNew       : TBitmap
  ): Boolean; OverLoad;
Var
  BackgroundColor : TColor;
  BitmapBackRect  : TRect;
  BitmapFrontRect : TRect;
  BitmapNewHeight : Integer;
  BitmapNewWidth  : Integer;
Begin
    BackgroundColor := clWhite;
    BitmapBackRect  := Rect(0,0,BitmapTop.Width,BitmapTop.Height);
    BitmapFrontRect := Rect(0,BitmapBottomTop,BitmapBottom.Width,BitmapBottomTop+BitmapBottom.Height);
    If BitmapTop.Width >= BitmapBottom.Width Then
    Begin
      BitmapNewWidth := BitmapTop.Width;
    End
    Else
    Begin
      BitmapNewWidth := BitmapBottom.Width;
    End;
    BitmapNewHeight  := BitmapBottomTop+BitmapBottom.Height;
    Result :=
      BitmapCombine(
        BackgroundColor , //BackgroundColor : TColor;
        BitmapTop       , //BitmapBack      : TBitmap;
        BitmapBackRect  , //BitmapBackRect  : TRect;
        BitmapBottom    , //BitmapFront     : TBitmap;
        BitmapFrontRect , //BitmapFrontRect : TRect;
        BitmapNewHeight , //BitmapNewHeight : Integer;
        BitmapNewWidth  , //BitmapNewWidth  : Integer;
        BitmapNew         //BitmapOut       : TBitmap
                        );//): Boolean;
End;

Function BitmapCombineVert(
  BitmapFileTop   : String;
  BitmapFileBottom: String;
  BitmapBottomTop : Integer;
  BitmapFileNew   : String
  ): Boolean; OverLoad;
Var
  BitmapTop       : TBitmap;
  BitmapBottom    : TBitmap;
  BitmapNew       : TBitmap;
Begin
  Result          := False;
  If Not FileExists(BitmapFileTop)    Then Exit;
  If Not FileExists(BitmapFileBottom) Then Exit;
  BitmapTop       := TBitmap.Create();
  BitmapBottom    := TBitmap.Create();
  BitmapNew       := TBitmap.Create();
  Try
    BitmapTop   .LoadFromFile(BitmapFileTop);
    BitmapBottom.LoadFromFile(BitmapFileBottom);
    Result :=
      BitmapCombineVert(
        BitmapTop       , //BitmapLeft      : TBitmap;
        BitmapBottom    , //BitmapRight     : TBitmap;
        BitmapBottomTop , //BitmapRightLeft : Integer;
        BitmapNew         //BitmapNew       : TBitmap
                        );//): Boolean; OverLoad;
    If Result Then
    Begin
      Try
        If FileExists(BitmapFileNew) Then DeleteFile(BitmapFileNew);
        BitmapNew.SaveToFile(BitmapFileNew);
      Except
        Result := False;
      End;
    End;
  Finally
    BitmapTop     .Free;
    BitmapBottom  .Free;
    BitmapNew     .Free;
  End;
End;

Function BitmapCombineVert(
  BitmapFileTop   : String;
  BitmapFileBottom: String;
  BitmapFileNew   : String
  ): Boolean; OverLoad;
Var
  BitmapBottomTop : Integer;
  BitmapTop       : TBitmap;
Begin
  Result          := False;
  If Not FileExists(BitmapFileTop)    Then Exit;
  If Not FileExists(BitmapFileBottom) Then Exit;
  BitmapTop       := TBitmap.Create();
  Try
    BitmapTop.LoadFromFile(BitmapFileTop);
    BitmapBottomTop := BitmapTop.Height;
  Finally
    BitmapTop.Free;
  End;
  Result :=
    BitmapCombineVert(
      BitmapFileTop   , //BitmapFileLeft  : String;
      BitmapFileBottom, //BitmapFileRight : String;
      BitmapBottomTop , //BitmapRightLeft : Integer;
      BitmapFileNew     //BitmapFileNew   : String
                      );//): Boolean; OverLoad;
End;

end.
                                                                                                          //