unit NewImagePanel;

interface

uses
  Windows,SysUtils, Classes, Controls, ExtCtrls,Graphics,Dialogs,Forms;

type
  RMRect=record
    A:TRect;
    B:TRect;
    C:TRect;
    D:TRect;
    AB:TRect;
    AC:TRect;
    BD:TRect;
    CD:TRect;
    WA:TRect;
    WB:TRect;
    WC:TRect;
    WD:TRect;
    WAB:TRect;
    WAC:TRect;
    WBD:TRect;
    WCD:TRect;
    X,Y,W,H:Integer;
    WX,WY,WW,WH:Integer;
 end;

  TWatermarkImage = class(TImage)
  private
    { Private declarations }
    IsClikW,MUp:Boolean;
    WMPoint:TPoint;
    XRect:TRect;
  protected
    { Protected declarations }
    procedure WFrameMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
    procedure WFrameMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
    procedure WFrameMouseUp(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
  public
    { Public declarations }
  published
    { Published declarations }
    constructor Create(Aowner:TComponent);override;
    destructor Destroy;override;
  end;

  TNewFrameimage = class(TImage)
  private
    FrameBrokenRect:TRect;
    MLeftDown,MUp:Boolean;
    MPoint:TPoint;
    { Private declarations }
  protected
    { Protected declarations }
    procedure FrameMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
    procedure FrameMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
    procedure FrameMouseUp(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
  public
    { Public declarations }

  published
    { Published declarations }
    constructor Create(Aowner:TComponent);override;
    destructor Destroy;override;
  end;


  TNewimage = class(TImage)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    constructor Create(Aowner:TComponent);override;
    destructor Destroy;override;
  end;

  TNewimagePanel = class(TWinControl)
  private
    { Private declarations }
    Newimage:TNewimage;
    NewFrameimage:TNewFrameimage;
    WatermarkImage:TWatermarkImage;
    FFrameRect: TRect;
    PicImageRect:TRect;
    Cbmp:TBitmap;
    FPicture:TPicture;
    FWatermarkPic: TPicture;
    WatkBit:TBitmap;
    procedure CanvasRec(CR: TRect; CCanvas: Tcanvas;Kind:Boolean=true);
    procedure SetPicture(const Value:TPicture);
    procedure SetFrameRect(const Value:TRect);
    procedure SetWatermarkPic(const Value:TPicture);
    procedure PaintPic(ACanvas: TCanvas; Bitmap: TBitmap);
    function StretchDraw(BigBmp: TBitmap; Width, Height,
      Edge: Integer): TBitmap;

  protected
    { Protected declarations }
  public
    { Public declarations }
    property FrameRect:TRect read FFrameRect write SetFrameRect;
    procedure Refresh;
    procedure ShowWatermark;
    procedure FullScreen;
  published
    { Published declarations }
    constructor Create(Aowner:TComponent);override;
    destructor Destroy;override;
    property Picture: TPicture read FPicture write SetPicture;
    property WatermarkPic:TPicture read FWatermarkPic write SetWatermarkPic;
  end;

var
    Cmr:RMRect;

const
  FOCUS_FRAME=20;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TNewimagePanel]);
end;

{ TNewimage }


constructor TNewimage.Create(Aowner: TComponent);

begin
  inherited;

end;

destructor TNewimage.Destroy;
begin
  inherited;
  ;
end;

constructor TNewFrameimage.Create(Aowner: TComponent);
begin
  inherited;
 
end;

destructor TNewFrameimage.Destroy;
begin

  inherited;
end;

procedure TNewFrameimage.FrameMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
   XRect:TRect;
begin
  with TNewimagePanel(Owner) do
    XRect:=Rect(PicImageRect.Left-4,PicImageRect.Top-4,PicImageRect.Right+4,PicImageRect.Bottom+4);

   TNewimagePanel(Owner).WatermarkImage.IsClikW:=false;
   TNewimagePanel(Owner).ShowWatermark;

 if  PtInRect(XRect,Point(x,Y)) then
  begin

     MLeftDown:=true;
     MPoint:=Point(x,y);
     if  (PtInRect(Cmr.A,Point(x,Y))) or (PtInRect(Cmr.AB,Point(x,Y))) or (PtInRect(Cmr.B,Point(x,Y)))
        or (PtInRect(Cmr.AC,Point(x,Y))) then
      MUp:=true
      else
      MUp:=false
  end;
end;

procedure TNewFrameimage.FrameMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Spoint:TPoint;
  cx,cy:integer;
  Sleft,STop,SWidth,SHeight:integer;
   XRect:TRect;
   CursorRect:TRect;
begin
  with TNewimagePanel(Owner) do
    XRect:=Rect(PicImageRect.Left-4,PicImageRect.Top-4,PicImageRect.Right+4,PicImageRect.Bottom+4);

 if (MLeftDown) and PtInRect(XRect,Point(x,Y)) then
  begin
     if Owner.ClassName = 'TNewimagePanel'  then
      begin
        Sleft:=TNewimagePanel(Owner).PicImageRect.Left;
        STop:=TNewimagePanel(Owner).PicImageRect.Top;
        SWidth:=TNewimagePanel(Owner).PicImageRect.Right;
        SHeight:=TNewimagePanel(Owner).PicImageRect.Bottom;
      end;
                           

    if  Cursor=crSizeAll then
      FrameBrokenRect := Rect(x-MPoint.x+Cmr.X,Y-(MPoint.Y-Cmr.Y),x-MPoint.x+Cmr.X+(Cmr.w-Cmr.x),Y-(MPoint.Y-Cmr.Y)+(Cmr.h-Cmr.y));

    if  Cursor=crSizeNWSE then
       if MUp then
        FrameBrokenRect := Rect(x-MPoint.x+Cmr.X,Y-(MPoint.Y-Cmr.Y),Cmr.w,Cmr.h)
        else
        FrameBrokenRect := Rect(Cmr.X,Cmr.Y,x-MPoint.x+Cmr.X+(Cmr.w-Cmr.x),Y-(MPoint.Y-Cmr.Y)+(Cmr.h-Cmr.y)) ;
    if  Cursor=crSizeNESW then
       if MUp then
         FrameBrokenRect := Rect(Cmr.X,Y-(MPoint.Y-Cmr.Y),x-MPoint.x+Cmr.X+(Cmr.w-Cmr.x),Cmr.h)
        else
        FrameBrokenRect := Rect(x-MPoint.x+Cmr.X,Cmr.Y,Cmr.w,Y-(MPoint.Y-Cmr.Y)+(Cmr.h-Cmr.y)) ;

    if  Cursor=crSizeNS then
       if MUp then
        FrameBrokenRect := Rect(Cmr.X,Y-(MPoint.Y-Cmr.Y),Cmr.w,Cmr.h)
        else
        FrameBrokenRect := Rect(Cmr.X,Cmr.Y,Cmr.w,Y-(MPoint.Y-Cmr.Y)+(Cmr.h-Cmr.y)) ;
       
    if  self.Cursor=crSizeWE then
       if MUp then
           FrameBrokenRect := Rect(x-MPoint.x+Cmr.X,Cmr.Y,Cmr.W,Cmr.h)
        else
           FrameBrokenRect := Rect(Cmr.X,Cmr.Y,x-MPoint.x+Cmr.X+(Cmr.w-Cmr.x),Cmr.h);

      if FrameBrokenRect.Left<SLeft then  FrameBrokenRect.Left:=SLeft-1;
      if FrameBrokenRect.Top<STop then  FrameBrokenRect.Top:=STop-1;
      if FrameBrokenRect.Right>SWidth then  FrameBrokenRect.Right:=SWidth+1;
      if FrameBrokenRect.Bottom>SHeight then  FrameBrokenRect.Bottom:=SHeight+1;

   if Cursor<>crSizeAll then
    begin
      if FrameBrokenRect.Right-FrameBrokenRect.Left<FOCUS_FRAME then
         if FrameBrokenRect.Left+1=Sleft  then
            FrameBrokenRect.Right:=FrameBrokenRect.Left+FOCUS_FRAME
            else
               if Mup  then
                   if Cursor=crSizeNESW then
                     FrameBrokenRect.Right:=FrameBrokenRect.Left+FOCUS_FRAME
                     else
                     FrameBrokenRect.Left:=FrameBrokenRect.Right-FOCUS_FRAME
                else
                   if Cursor=crSizeNESW then
                     FrameBrokenRect.Left:=FrameBrokenRect.Right-FOCUS_FRAME
                     else
                     FrameBrokenRect.Right:=FrameBrokenRect.Left+FOCUS_FRAME;
      if FrameBrokenRect.Bottom-FrameBrokenRect.Top<FOCUS_FRAME then
        if FrameBrokenRect.Top+1=STop then
         FrameBrokenRect.Bottom:=FrameBrokenRect.Top+FOCUS_FRAME
         else
            if Mup  then
              FrameBrokenRect.Top:=FrameBrokenRect.Bottom-FOCUS_FRAME
             else
             FrameBrokenRect.Bottom:=FrameBrokenRect.Top+FOCUS_FRAME;

       //限制缩小范围
        if  FrameBrokenRect.Left>TNewimagePanel(Owner).WatermarkImage.Left then
           FrameBrokenRect.Left:=TNewimagePanel(Owner).WatermarkImage.Left;

        if FrameBrokenRect.Top>TNewimagePanel(Owner).WatermarkImage.Top then
           FrameBrokenRect.Top:=TNewimagePanel(Owner).WatermarkImage.Top;

        if FrameBrokenRect.Right<TNewimagePanel(Owner).WatermarkImage.Left+TNewimagePanel(Owner).WatermarkImage.Width then
           FrameBrokenRect.Right:=TNewimagePanel(Owner).WatermarkImage.Left+TNewimagePanel(Owner).WatermarkImage.Width ;

        if FrameBrokenRect.Bottom<TNewimagePanel(Owner).WatermarkImage.Top+TNewimagePanel(Owner).WatermarkImage.Height then
           FrameBrokenRect.Bottom:=TNewimagePanel(Owner).WatermarkImage.Top+TNewimagePanel(Owner).WatermarkImage.Height;
    end
    else
    begin
      if  FrameBrokenRect.Bottom-FrameBrokenRect.Top<Cmr.H-Cmr.Y then
        if FrameBrokenRect.Top=STop-1 then
          FrameBrokenRect.Bottom:=Cmr.H-Cmr.Y+STop-1
          else
          FrameBrokenRect.Top:=FrameBrokenRect.Bottom-Cmr.H+Cmr.Y;

      if  FrameBrokenRect.Right-FrameBrokenRect.Left<Cmr.W-Cmr.X then
         if FrameBrokenRect.Left=SLeft-1 then
           FrameBrokenRect.Right:=SLeft+Cmr.W-Cmr.X-1
           else
           FrameBrokenRect.Left:=FrameBrokenRect.Right-Cmr.W+Cmr.X;
    end;
      canvas.FillRect(Rect(0,   0,  Width,   Height));
      DrawFocusRect(Canvas.Handle, FrameBrokenRect);
  end
  else
  begin
   Cursor:=crDefault;
  if  PtInRect(Rect(Cmr.X,Cmr.Y,Cmr.W,Cmr.H),Point(x,Y)) then
    Cursor:=crSizeAll;
  if  (PtInRect(Cmr.A,Point(x,Y))) or (PtInRect(Cmr.D,Point(x,Y))) then
    Cursor:=crSizeNWSE;
  if  (PtInRect(Cmr.B,Point(x,Y))) or (PtInRect(Cmr.C,Point(x,Y))) then
    Cursor:=crSizeNESW;
  if  (PtInRect(Cmr.AC,Point(x,Y))) or (PtInRect(Cmr.BD,Point(x,Y))) then
    Cursor:=crSizeWE;
  if  (PtInRect(Cmr.AB,Point(x,Y))) or (PtInRect(Cmr.CD,Point(x,Y))) then
    Cursor:=crSizeNS;
  end;
end;

procedure TNewFrameimage.FrameMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  CursorRect:TRect;
begin
  if MLeftDown then
  begin
   canvas.FillRect(Rect(0,   0,   Width,   Height));
   TNewimagePanel(Owner).FrameRect:=FrameBrokenRect;
    if Assigned(TNewimagePanel(Owner).WatermarkImage) then
     begin
        TNewimagePanel(Owner).WatermarkImage.Left:=FrameBrokenRect.Left;
        TNewimagePanel(Owner).WatermarkImage.Top:=FrameBrokenRect.Top;
     end;
   MLeftDown:=False;
               { CursorRect:=Rect(0,   0, Screen.Width,Screen.Height);
                MapWindowPoints(GetDesktopWindow,   0,  CursorRect,   2);   //   座标换算
                ClipCursor(@CursorRect);   //   限制鼠标移动区域   }
  end;
end;

 


{ TNewimagePanel }

procedure TNewimagePanel.CanvasRec(CR: TRect; CCanvas: Tcanvas;Kind:Boolean=true);
var
  x,y,w,h:integer;
begin
  if  Kind then
  begin
     with CCanvas do
      begin
      Pen.Color   :=  clNone;
      Brush.Color := clNone;
      x:=CR.Left;
      y:=CR.Top;
      w:=CR.Right-CR.Left;
      h:=CR.Bottom-CR.Top;
      Cmr.X:=x;
      Cmr.Y:=y;
      Cmr.W:=x+ w;
      Cmr.H:=y+h;
      FrameRect(CR);
      Rectangle(x-3,y-3, X+1,Y+1);
      Cmr.A:=Rect(x-3,y-3, X+1,Y+1);
      Rectangle(x-3,y+h-1, x+1,y+h+3);
      Cmr.C:=Rect(x-3,y+h-1, x+1,y+h+3);
      Rectangle(x+w-1,y-3, x+w+3,Y+1);
      Cmr.B:=Rect(x+w-1,y-3, x+w+3,Y+1);
      Rectangle(x+w-1,y+h-1, x+w+3,y+h+3);
      Cmr.D:=Rect(x+w-1,y+h-1, x+w+3,y+h+3);
      Rectangle(x-3,y+(h div 2)-2, x+1,y+(h div 2)+2);
      Cmr.AC:=Rect(x-3,y+(h div 2)-2, x+1,y+(h div 2)+2);

      Rectangle(x+w-1,y+(h div 2)-2, x+w+3,y+(h div 2)+2);
      Cmr.BD:=Rect(x+w-1,y+(h div 2)-2, x+w+3,y+(h div 2)+2);

      Rectangle(x+(w div 2)-2,y-3, x+(w div 2)+2,Y+1);
      Cmr.AB:=Rect(x+(w div 2)-2,y-3, x+(w div 2)+2,Y+1);

      Rectangle(x+(w div 2)-2,y+h-1, x+(w div 2)+2,y+h+3);
      Cmr.CD:=Rect(x+(w div 2)-2,y+h-1, x+(w div 2)+2,y+h+3);
      end;
  end
  else
  begin
     with CCanvas do
      begin

      x:=CR.Left;
      y:=CR.Top;
      w:=CR.Right-CR.Left;
      h:=CR.Bottom-CR.Top;
      Cmr.WX:=x;
      Cmr.WY:=y;
      Cmr.WW:=x+w;
      Cmr.WH:=y+h;

 

      Pen.Color   :=  clBlack;
      Brush.Color := clBlack;
      Pen.Style :=psDash;

      Rectangle(x,y, X+4,Y+4);
      Cmr.WA:=Rect(x,y, X+4,Y+4);

      Rectangle(x,y+h-4, x+4,y+h);
      Cmr.WC:=Rect(x,y+h-4, x+4,y+h);

      Rectangle(x+w-4,y, x+w,Y+4);
      Cmr.WB:=Rect(x+w-4,y, x+w,Y+4);

      Rectangle(x+w-4,y+h-4,x+w,y+h);
      Cmr.WD:=Rect(x+w-4,y+h-4,x+w,y+h);

      Rectangle(x,y+(h div 2)-2, x+4,y+(h div 2)+2);
      Cmr.WAC:=Rect(x,y+(h div 2)-2, x+4,y+(h div 2)+2);

      Rectangle(x+w-4,y+(h div 2)-2, x+w,y+(h div 2)+2);
      Cmr.WBD:=Rect(x+w-4,y+(h div 2)-2, x+w,y+(h div 2)+2);

      Rectangle(x+(w div 2)-2,y, x+(w div 2)+2,Y+4);
      Cmr.WAB:=Rect(x+(w div 2)-2,y, x+(w div 2)+2,Y+4);

      Rectangle(x+(w div 2)-2,y+h-4, x+(w div 2)+2,y+h);
      Cmr.WCD:=Rect(x+(w div 2)-2,y+h-4, x+(w div 2)+2,y+h);

    //  Pen.Mode := pmXOr;
      Pen.Style := psDot;
       If WatermarkImage.IsClikW then
         Pen.Color:=clWhite
         else
         Pen.Color:=clMedGray;
      PolyLine([Point(CR.Left,CR.Top),Point(CR.Left,CR.Bottom-1),Point(CR.Right,CR.Bottom-1)]);
      PolyLine([Point(CR.Left,CR.Top),Point(CR.Right-1,CR.Top),Point(CR.Right-1,CR.Bottom-1)]);
      end;
  end;
end;

constructor TNewimagePanel.Create(Aowner: TComponent);
begin
  inherited;
  Width:=250;
  Height:=50;
  Color:=clWindow;
  DoubleBuffered:=true;
  FPicture := TPicture.Create;
  FWatermarkPic:=TPicture.Create;
 
  Newimage:=TNewimage.Create(self);
  Newimage.Parent:=self;
  Newimage.Align:=alClient;
  Newimage.Left:=Left;
  Newimage.Top:=Left;
  Newimage.Width:=Width;
  Newimage.Height:=Height;
  Newimage.Center:=true;


  NewFrameimage:=TNewFrameimage.Create(self);
  NewFrameimage.Parent:=self;
  NewFrameimage.Align:=alClient;
  NewFrameimage.Left:=Left;
  NewFrameimage.Top:=Top;
  NewFrameimage.Width:=Width;
  NewFrameimage.Height:=Height;
  NewFrameimage.Transparent:=true;
  NewFrameimage.OnMouseMove:=NewFrameimage.FrameMouseMove;
  NewFrameimage.OnMouseDown:=NewFrameimage.FrameMouseDown;
  NewFrameimage.OnMouseUp:=NewFrameimage.FrameMouseUp;


end;

destructor TNewimagePanel.Destroy;
begin
  inherited;
  FPicture.Free;
  FWatermarkPic.Free;
  WatkBit.Free;
end;

function TNewimagePanel.StretchDraw(BigBmp:TBitmap;Width:Integer;Height:Integer;Edge:Integer):TBitmap;
begin
     if (BigBmp.Width<=Width-Edge) and (BigBmp.Height<=Height-Edge) then
     begin
        Result.Width:=BigBmp.Width;
        Result.Height:=BigBmp.Height;
     end
     else
     begin
       if (BigBmp.Width<=Width-Edge) and (BigBmp.Height>Height-Edge) then
         begin
            Result.Width:=Trunc(BigBmp.Width*(Height-Edge)/BigBmp.Height);
            Result.Height:=Height-Edge;
         end;
       if (BigBmp.Height<=Height-Edge) and (BigBmp.Width>Width-Edge) then
         begin
            Result.Width:=Width-Edge;
            Result.Height:=Trunc(BigBmp.Height*(Width-Edge)/BigBmp.Width);
         end;
       if (BigBmp.Height>Height-Edge) and (BigBmp.Width>Width-Edge) then
        begin
           if  BigBmp.Width>BigBmp.Height then
             begin
               if BigBmp.Height<Height-Edge then
                begin
                Result.Width:=Width-Edge;
                Result.Height:=Trunc(BigBmp.Height*(Width-Edge)/BigBmp.Width);
                end
                else
                begin
                Result.Width:=Trunc(BigBmp.Width*(Height-Edge)/BigBmp.Height);
                Result.Height:=Height-Edge;
                end;
             end;
           if  BigBmp.Width<BigBmp.Height then
             begin
               if BigBmp.Width<Width-Edge then
                begin
                Result.Width:=Width-Edge;
                Result.Height:=Trunc(BigBmp.Height*(Width-Edge)/BigBmp.Width);
                end
                else
                begin
                Result.Width:=Trunc(BigBmp.Width*(Height-Edge)/BigBmp.Height);
                Result.Height:=Height-Edge;
                end;
             end;
           if  BigBmp.Width=BigBmp.Height then
             begin
               Result.Width:=Width-Edge;
               Result.Height:=Width-Edge;
             end;
          end;
        end;
   Result.Canvas.StretchDraw(Result.Canvas.ClipRect,BigBmp);
end;

procedure TNewimagePanel.Refresh;
var
  Buf,BufB,BufC:TBitmap;
begin
   Buf:=TBitmap.Create;
   BufB:=TBitmap.Create;
   BufC:=TBitmap.Create;
   WatkBit:=TBitmap.Create;
   Buf:=Picture.Bitmap;
  if (Buf.Width<=Width-10) and (Buf.Height<=Height-10) then
     begin
        BufB.Width:=Buf.Width;
        BufB.Height:=Buf.Height;
     end
     else
     begin
       if (Buf.Width<=Width-10) and (Buf.Height>Height-10) then
         begin
            BufB.Width:=Trunc(Buf.Width*(Height-10)/Buf.Height);
            BufB.Height:=Height-10;
         end;
       if (Buf.Height<=Height-10) and (Buf.Width>Width-10) then
         begin
            BufB.Width:=Width-10;
            BufB.Height:=Trunc(Buf.Height*(Width-10)/Buf.Width);
         end;
       if (Buf.Height>Height-10) and (Buf.Width>Width-10) then
        begin
           if  Buf.Width>Buf.Height then
             begin
               if Buf.Height<Height-10 then
                begin
                BufB.Width:=Width-10;
                BufB.Height:=Trunc(Buf.Height*(Width-10)/Buf.Width);
                end
                else
                begin
                BufB.Width:=Trunc(Buf.Width*(Height-10)/Buf.Height);
                BufB.Height:=Height-10;
                end;
             end;
           if  Buf.Width<Buf.Height then
             begin
               if Buf.Width<Width-10 then
                begin
                BufB.Width:=Width-10;
                BufB.Height:=Trunc(Buf.Height*(Width-10)/Buf.Width);
                end
                else
                begin
                BufB.Width:=Trunc(Buf.Width*(Height-10)/Buf.Height);
                BufB.Height:=Height-10;
                end;
             end;
           if  Buf.Width=Buf.Height then
             begin
               BufB.Width:=Width-10;
               BufB.Height:=Width-10;
             end;
          end;
        end;
   BufB.Canvas.StretchDraw(BufB.Canvas.ClipRect,Buf);
   BufC.Width:=Width;
   BufC.Height:=Height;
   BitBlt(BufC.Canvas.Handle, (Width-BufB.Width) div 2, (Height-BufB.Height) div 2, BufB.Width, BufB.Height, BufB.Canvas.Handle, 0, 0, SRCCOPY);
   PicImageRect:=Rect((Width-BufB.Width) div 2,(Height-BufB.Height) div 2,BufB.Width+(Width-BufB.Width) div 2,BufB.Height+(Height-BufB.Height) div 2);
   Newimage.Picture.Graphic:=BufC;
   BufB.Free;
   BufC.Free;
   Buf:=nil;
   Buf.Free;
end;

procedure TNewimagePanel.ShowWatermark;
var
  XRect:TRect;
  Buf,BufB,BufC:TBitmap;
  Cwidth,CHeight:integer;
begin
   Buf:=TBitmap.Create;
   BufB:=TBitmap.Create;
   BufC:=TBitmap.Create;
   WatkBit:=TBitmap.Create;
   Buf:=WatermarkPic.Bitmap;
   Cwidth:=Width div 4;
   CHeight:=Height div 4;
  
  if (Buf.Width<=CWidth) and (Buf.Height<=CHeight) then
     begin
        BufB.Width:=Buf.Width;
        BufB.Height:=Buf.Height;
     end
     else
     begin
       if (Buf.Width<=CWidth) and (Buf.Height>CHeight) then
         begin
            BufB.Width:=Trunc(Buf.Width*(CHeight)/Buf.Height);
            BufB.Height:=CHeight;
         end;
       if (Buf.Height<=CHeight) and (Buf.Width>CWidth) then
         begin
            BufB.Width:=CWidth;
            BufB.Height:=Trunc(Buf.Height*(CWidth)/Buf.Width);
         end;
       if (Buf.Height>CHeight) and (Buf.Width>CWidth) then
        begin
           if  Buf.Width>Buf.Height then
             begin
               if Buf.Height<CHeight then
                begin
                BufB.Width:=CWidth;
                BufB.Height:=Trunc(Buf.Height*(CWidth)/Buf.Width);
                end
                else
                begin
                BufB.Width:=Trunc(Buf.Width*(CHeight)/Buf.Height);
                BufB.Height:=CHeight;
                end;
             end;
           if  Buf.Width<Buf.Height then
             begin
               if Buf.Width<CWidth then
                begin
                BufB.Width:=CWidth;
                BufB.Height:=Trunc(Buf.Height*(CWidth)/Buf.Width);
                end
                else
                begin
                BufB.Width:=Trunc(Buf.Width*(CHeight)/Buf.Height);
                BufB.Height:=CHeight;
                end;
             end;
           if  Buf.Width=Buf.Height then
             begin
               BufB.Width:=CWidth;
               BufB.Height:=CWidth;
             end;
          end;
        end;

   BufB.Canvas.StretchDraw(BufB.Canvas.ClipRect,Buf);
  // WPicImageRect:=Rect((Width-BufB.Width) div 2,(Height-BufB.Height) div 2,BufB.Width+(Width-BufB.Width) div 2,BufB.Height+(Height-BufB.Height) div 2);
   BufC.Width:=BufB.Width+2;
   BufC.Height:=BufB.Height+2;
   BufC.Canvas.brush.color:=clBlack;
   BufC.canvas.FillRect(Rect(0,   0,   BufC.Width,   BufC.Height));
 //  BufC.Canvas.FloodFill(0,0,clBlack,fsBorder);
   BitBlt(BufC.Canvas.Handle, 1,1,BufB.Width+1, BufB.Height+1, BufB.Canvas.Handle, 0, 0, SRCCOPY);

 

  if not Assigned(WatermarkImage) then
     begin
        WatermarkImage:=TWatermarkImage.Create(self);
        WatermarkImage.Parent:=Self;
        WatermarkImage.Left:=PicImageRect.Left-1;
        WatermarkImage.Top:=PicImageRect.Top-1;
        WatermarkImage.Proportional:=false;
        WatermarkImage.Center:=true;
        WatermarkImage.OnMouseDown:=WatermarkImage.WFrameMouseDown;
        WatermarkImage.OnMouseUp:=WatermarkImage.WFrameMouseUp;
        WatermarkImage.OnMouseMove:=WatermarkImage.WFrameMouseMove;
    end;
        WatermarkImage.Picture.Assign(WatermarkPic);
        WatermarkImage.Width:=BufC.Width;
        WatermarkImage.Height:=BufC.Height;
   WatermarkImage.Picture.Graphic:=BufC;
   CanvasRec(Rect(0,0,WatermarkImage.Width,WatermarkImage.Height),WatermarkImage.Canvas,false);
   BufB.Free;
   Buf:=nil;
   Buf.Free;

end;

procedure TNewimagePanel.SetFrameRect(const Value: TRect);
begin
   FFrameRect:=Value;
   Refresh;
   CanvasRec(FFrameRect,Newimage.Canvas);
end;


procedure TNewimagePanel.SetPicture(const Value: TPicture);
begin
    FPicture.Assign(Value);
end;

procedure TNewimagePanel.PaintPic(ACanvas: TCanvas; Bitmap: TBitmap);   //画透明图标
var
    ImageList : TImageList;
    TransColor : TColor;
begin
    if (Bitmap.Width = 0) or (Bitmap.Height = 0) then
        Exit;

    TransColor := Bitmap.Canvas.Pixels[0, 5];

    ImageList := TImageList.CreateSize(Bitmap.Width, Bitmap.Height);
    try
        ImageList.AddMasked(Bitmap, TransColor);
        ImageList.Draw(ACanvas, 0, 0, 0, Enabled);
    finally
        ImageList.Free();
    end;
end;

procedure TNewimagePanel.FullScreen;
var
  Xrect:TRect;
begin
    Xrect:=Rect(PicImageRect.Left-1,PicImageRect.Top-1,PicImageRect.Right+1,PicImageRect.Bottom+1);
    CanvasRec(Xrect,Newimage.Canvas);
end;

procedure TNewimagePanel.SetWatermarkPic(const Value: TPicture);
begin
   FWatermarkPic.Assign(Value);
end;

{ TWatermarkImage }

constructor TWatermarkImage.Create(Aowner: TComponent);
begin
  inherited;

end;

destructor TWatermarkImage.Destroy;
begin

  inherited;
end;

procedure TWatermarkImage.WFrameMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin

    IsClikW:=True;
    TNewimagePanel(Owner).ShowWatermark;
    WMPoint:=Point(x,y);

     if  (PtInRect(Cmr.WA,Point(x,Y))) or (PtInRect(Cmr.WAB,Point(x,Y))) or (PtInRect(Cmr.WB,Point(x,Y)))
        or (PtInRect(Cmr.WAC,Point(x,Y))) then
      MUp:=true
      else
      MUp:=false

end;

procedure TWatermarkImage.WFrameMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  if IsClikW and  ( ssleft   in   shift ) then
   begin
    if  Cursor=crSizeAll then
       begin
        left:=left+x-WMPoint.x;
        Top:=top+Y-WMPoint.Y;
        if Left<TNewimagePanel(Owner).FrameRect.Left then
           left:=TNewimagePanel(Owner).FrameRect.Left;
        if Top<TNewimagePanel(Owner).FrameRect.Top then
           Top:=TNewimagePanel(Owner).FrameRect.Top;
        if Left+width>TNewimagePanel(Owner).FrameRect.Right then
           Left:=TNewimagePanel(Owner).FrameRect.Right-width;
        if Top+Height>TNewimagePanel(Owner).FrameRect.Bottom then
           Top:=TNewimagePanel(Owner).FrameRect.Bottom-Height;
       end;
    if Cursor=crSizeNWSE then
       begin
         if MUp then
           begin
            left:=left+(x-WMPoint.x);
            Top:=top+(Y-WMPoint.Y);
           end
           else
           begin
            left:=left+x-WMPoint.x;
            Top:=top+Y-WMPoint.Y;
           end;
       end;
   end
   else
   begin
   Cursor:=crDefault;
  if  PtInRect(Rect(Cmr.WX,Cmr.WY,Cmr.WW,Cmr.WH),Point(x,Y)) then
    Cursor:=crSizeAll;
  if  (PtInRect(Cmr.WA,Point(x,Y))) or (PtInRect(Cmr.WD,Point(x,Y))) then
    Cursor:=crSizeNWSE;
  if  (PtInRect(Cmr.WB,Point(x,Y))) or (PtInRect(Cmr.WC,Point(x,Y))) then
    Cursor:=crSizeNESW;
  if  (PtInRect(Cmr.WAC,Point(x,Y))) or (PtInRect(Cmr.WBD,Point(x,Y))) then
    Cursor:=crSizeWE;
  if  (PtInRect(Cmr.WAB,Point(x,Y))) or (PtInRect(Cmr.WCD,Point(x,Y))) then
    Cursor:=crSizeNS;
   end;
end;

procedure TWatermarkImage.WFrameMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
   IsClikW:=false;
end;

end.

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值