unit getpic;

interface

uses
  Windows, Messages, SysUtils, strUtils,Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ToolWin, ExtCtrls, jpeg, IniFiles, ExtDlgs,
  DelphiTwain, Buttons, StdCtrls, DB, ADODB, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdFTP;

type
  TFormGetPic = class(TForm)
    Twain: TDelphiTwain;
    ScrollBox1: TScrollBox;
    Image1: TImage;
    OpenPictureDialog1: TOpenPictureDialog;
    Image2: TImage;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    Button1: TButton;
    Button2: TButton;
    ADOQuery1: TADOQuery;
    SpeedButton4: TSpeedButton;
    SaveDialog1: TSavePictureDialog;
    adoqueryImage: TADOQuery;
    IdFTP1: TIdFTP;
    SpeedButton5: TSpeedButton;
    procedure ToolButton1Click(Sender: TObject);
    procedure ToolButton3Click(Sender: TObject);
    procedure TwainTwainAcquire(Sender: TObject; const Index: Integer;
      Image: TBitmap; var Cancel: Boolean);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure Initimage();
    procedure SpeedButton5Click(Sender: TObject);
  private
    hWndC : THandle;
    CapturingAVI : bool;
    { Private declarations }
    ClickPos: TPoint;
    SelectedSource, PicLeft, PicTop, PicWidth, PicHeight: Integer;
    procedure CreThumb(Width, Height: Integer);
    function SaveImage():Boolean;
  public
    FilePath:string;
    FileName:string;
    FTFType:string;
    pat1:string;
    pic1:string;
    fkeyNo:string;
    fFlileFlag:string;
    { Public declarations }
    MyJpeg: TJPEGImage;
//    JPStream: TMemoryStream;
  end;

var
  FormGetPic: TFormGetPic;

implementation
uses  U_DataLink,U_Fun10;
const WM_CAP_START = WM_USER;
const WM_CAP_STOP = WM_CAP_START + 68;
const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
const WM_CAP_SAVEDIB = WM_CAP_START + 25;
const WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
const WM_CAP_SEQUENCE = WM_CAP_START + 62;
const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
const WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+  63 ;
const WM_CAP_SET_OVERLAY =WM_CAP_START+  51 ;
const WM_CAP_SET_PREVIEW =WM_CAP_START+  50 ;
const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6;
const WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2;
const WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3;
const WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5;
const WM_CAP_SET_SCALE=WM_CAP_START+  53 ;
const WM_CAP_SET_PREVIEWRATE=WM_CAP_START+  52 ;
function capCreateCaptureWindowA(lpszWindowName : PCHAR;
dwStyle : longint;
x : integer;
y : integer;
nWidth : integer;
nHeight : integer;
ParentWin : HWND;
nId : integer): HWND;
STDCALL EXTERNAL 'AVICAP32.DLL';

{$R *.dfm}

procedure TFormGetPic.Initimage();
var
  jpg:TJpegImage;
  myStream: TADOBlobStream;
  sFieldName:string;
  JPStream: TMemoryStream;
begin
  jpg:=TJpegImage.Create();
  JPStream := TMemoryStream.Create;
  try

    with adoqueryImage do
    begin
      close;
      sql.Clear;
      sql.Add('select * from TP_File where WBID='+quotedstr(trim(fkeyNo)));
      open;
      IF not IsEmpty then
      begin
        IF not fieldbyname(pic1).IsNull then
        begin
          myStream:=tadoblobstream.Create(tblobfield(adoqueryImage.fieldbyname(pic1)),bmread);
          jpg.LoadFromStream(myStream);
          Image2.Picture.Assign(jpg);
          myStream.Free;

           try
             IdFTP1.Host :=  ReadINIFileStr('SYSTEMSET.INI','SERVER','服务器地址','127.0.0.1');
             IdFTP1.Username := 'three';
		         IdFTP1.Password := '641010';
             IdFTP1.Connect();
            except
             
            end;

            JPStream.Clear;
            if IdFTP1.Connected then
            begin
              try
                IdFTP1.Get(fFlileFlag+'\'+ Trim(fieldbyname(pat1).AsString), JPStream);
              except
                Application.MessageBox('客户图样文件不存在', '提示', MB_ICONWARNING);
                IdFTP1.Quit;
                Exit;
              end;
            end
            else
            begin
              Application.MessageBox('无法连接文件服务器', '提示', MB_ICONWARNING);
              IdFTP1.Quit;
              Exit;
            end;

            if IdFTP1.Connected then IdFTP1.Quit;
            JPStream.Position := 0;
            jpg.LoadFromStream(JPStream);
            Image1.Picture.Assign(jpg);
        end;
      end;
    end;
  finally
    jpg.free;
    JPStream.Free;
  end;
end;

function TFormGetPic.SaveImage():Boolean;
var
	myStream: TADOBlobStream;
  maxNo:string;
  fNewFileName:string;
begin
  fNewFileName:=formatdatetime('yyyyMMddhhnnsszzz',now())+ExtractFileExt(FilePath);
  IF fkeyNO='' then fkeyNO:=fNewFileName;
  result:=false;
  try
    with adoqueryImage do
    begin
      close;
      sql.Clear;
      sql.Add('select * from TP_File where WBID='+quotedstr(trim(fkeyNo)));
      sql.Add('and TFType='+quotedstr(trim(FTFType)));
      open;
      if RecordCount<=0 then
      begin
        Append;
        if GetLSNo(ADOQuery1,maxNo,'FJ','TP_File',4,1)=False then
        begin
          Application.MessageBox('取最大号失败！','提示',0);
          Exit;
        end;
        fieldByName('TFID').AsString := maxNo;
        fieldByName('WBID').AsString := fkeyNO;
      end
      else
      begin
        edit;
      end;
      fieldByName(pat1).AsString :=trim(fNewFileName);
      fieldByName('Filler').AsString :=trim(dName);
      fieldByName('TFType').AsString :=trim(FTFType);
      myStream := TADOBlobStream.Create(TBlobField(FieldByName(pic1)), bmWrite);
      MyJpeg.Assign(Image2.Picture.Graphic);
      MyJpeg.SaveToStream(myStream);
      myStream.Free;
      Post;
    end;
    if FilePath <> '' then
    begin
      try
        IdFTP1.Host := ReadINIFileStr('SYSTEMSET.INI','SERVER','服务器地址','127.0.0.1');
        IdFTP1.Username := 'three';
        IdFTP1.Password := '641010';
        IdFTP1.Connect();
        IdFTP1.Put(FilePath, fFlileFlag+'\' + Trim(fNewFileName));
        IdFTP1.Quit;
      except
        IdFTP1.Quit;
        Application.MessageBox('上传客户图样文件失败，请检查文件服务器！', '提示', MB_ICONWARNING);
      end;
    end;
    IdFTP1.Quit;
    result:=true;
  except
    myStream.Free;
  end;
end;

procedure TFormGetPic.ToolButton1Click(Sender: TObject);
var
  Ini: TIniFile;
begin
  if Twain.LoadLibrary then
  begin
    {Load source manager}
    Twain.SourceManagerLoaded := TRUE;
    {Allow user to select source}
    SelectedSource := Twain.SelectSource;
    if SelectedSource <> -1 then
    begin
      Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'scanner.ini');
      try
        Ini.WriteInteger( 'SCANNER', 'Scanner', SelectedSource);
      finally
        Ini.Free;
      end;
    end {if SelectedSource <> -1}
  end
  else
    ShowMessage('未安装扫描仪');
end;

procedure TFormGetPic.ToolButton3Click(Sender: TObject);
begin
  if Twain.LoadLibrary then
  begin
    {Load source manager}
    Twain.SourceManagerLoaded := TRUE;

    if SelectedSource <> -1 then
    begin
      {Load source, select transference method and enable (display interface)}
      Twain.Source[SelectedSource].Loaded := TRUE;
      Twain.Source[SelectedSource].SetICapUnits(tuInches);
      Twain.Source[SelectedSource].SetImagelayoutFrame(PicLeft/25.4, PicTop/25.4, (PicLeft+PicWidth)/25.4, (PicTop+PicHeight)/25.4);
      Twain.Source[SelectedSource].SetIYResolution(200);
      Twain.Source[SelectedSource].SetIXResolution(200);
      Twain.Source[SelectedSource].TransferMode := ttmMemory;
      Twain.Source[SelectedSource].EnableSource(FALSE, TRUE);
      while Twain.Source[SelectedSource].Enabled do Application.ProcessMessages;
    end; {if SelectedSource <> -1}
//    Twain.UnloadLibrary;
  end
  else
    ShowMessage('未安装扫描仪');
end;

procedure TFormGetPic.TwainTwainAcquire(Sender: TObject;
  const Index: Integer; Image: TBitmap; var Cancel: Boolean);
begin
  Image1.Picture.Assign(Image);
  Cancel := TRUE;
  CreThumb(150, 150);
  SpeedButton2.Enabled := TRUE;
end;

procedure TFormGetPic.FormShow(Sender: TObject);
var
  Ini: TIniFile;
begin
 { Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'scanner.ini');
  try
    SelectedSource := Ini.ReadInteger( 'SCANNER', 'Scanner', 0);
    PicLeft := Ini.ReadInteger( 'SCANNER', 'Left', 0);
    PicTop := Ini.ReadInteger( 'SCANNER', 'Top', 0);
    PicWidth := Ini.ReadInteger( 'SCANNER', 'Width', 100);
    PicHeight := Ini.ReadInteger( 'SCANNER', 'Height', 100);
  finally
    Ini.Free;
  end;   }
  Initimage();
end;

{
procedure TFormGetPic.ToolButton6Click(Sender: TObject);
var
  Ini: TIniFile;
begin
  FormGetPos := TFormGetPos.Create(Self);
  FormGetPos.SpinEdit1.Value := PicLeft;
  FormGetPos.SpinEdit2.Value := PicTop;
  FormGetPos.SpinEdit3.Value := PicWidth;
  FormGetPos.SpinEdit4.Value := PicHeight;
  if FormGetPos.ShowModal = 1 then
  begin
    PicLeft := FormGetPos.SpinEdit1.Value;
    PicTop := FormGetPos.SpinEdit2.Value;
    PicWidth := FormGetPos.SpinEdit3.Value;
    PicHeight := FormGetPos.SpinEdit4.Value;

    Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'scanner.ini');
    try
      Ini.WriteInteger( 'SCANNER', 'Left', PicLeft);
      Ini.WriteInteger( 'SCANNER', 'Top', PicTop);
      Ini.WriteInteger( 'SCANNER', 'Width', PicWidth);
      Ini.WriteInteger( 'SCANNER', 'Height', PicHeight);
    finally
      Ini.Free;
    end;
  end;
  FormGetPos.Free;
end;
}

procedure TFormGetPic.CreThumb(Width, Height: Integer);
var
  Bitmap: TBitmap;
  Ratio: Double;
  ARect: TRect;
  AHeight, AHeightOffset: Integer;
  AWidth, AWidthOffset: Integer;
begin
  Bitmap := TBitmap.Create;
  try
    Ratio := Image1.Picture.Graphic.Width/Image1.Picture.Graphic.Height;
    if Ratio > 1.333 then
    begin
      AHeight := Round(Width/Ratio);
      AHeightOffset := (Height-AHeight) div 2;
      AWidth := Width;
      AWidthOffset := 0;
    end
    else
    begin
      AWidth := Round(Height*Ratio);
      AWidthOffset := (Width-AWidth) div 2;
      AHeight := Height;
      AHeightOffset := 0;
    end;
    Bitmap.Width := Width;
    Bitmap.Height := Height;
    Bitmap.Canvas.Brush.Color := clBtnFace;
    Bitmap.Canvas.FillRect(Rect(0, 0, Width, Height));
// StretchDraw original image
    ARect := Rect(AWidthOffset, AHeightOffset, AWidth+AWidthOffset, AHeight+AHeightOffset);
    Bitmap.Canvas.StretchDraw(ARect, Image1.Picture.Graphic);
// Assign back to the Jpeg, and save to the file
    Image2.Picture.Assign(BitMap);
//    MyJpeg1.Assign(Image2.Picture.Graphic);
  finally
    Bitmap.Free;
  end;
end;

procedure TFormGetPic.FormCreate(Sender: TObject);
begin
  MyJpeg := TJpegImage.Create;
//  MyJpeg1 := TJpegImage.Create;
  Button2.Enabled:=false;
end;

procedure TFormGetPic.FormDestroy(Sender: TObject);
begin
//  MyJpeg1.Free;
  MyJpeg.Free;
end;

procedure TFormGetPic.Image1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ClickPos.x := X;
  ClickPos.y := Y;
end;

procedure TFormGetPic.Image1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  NewPos: TPoint;
begin
  {The left button was pressed}
  if ssLeft in Shift then
  begin
    {Calculate new position}
    NewPos.X := Image1.Left + x - ClickPos.x;
    NewPos.Y := Image1.Top + y - ClickPos.y;
    if NewPos.x + Image1.Width < ScrollBox1.Width then
      NewPos.x := ScrollBox1.Width - Image1.Width;
    if NewPos.y + Image1.Height < ScrollBox1.Height then
      NewPos.y := ScrollBox1.Height - Image1.Height;
    if NewPos.X > 0 then NewPos.X := 0;
    if NewPos.Y > 0 then NewPos.Y := 0;

    Image1.Top := NewPos.Y;
    Image1.Left := NewPos.X;
  end {if ssLeft in Shift}
end;

procedure TFormGetPic.SpeedButton1Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
  begin
    Image1.Top := 0;
    Image1.Left := 0;
    Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    FilePath:=OpenPictureDialog1.FileName;
    FileName:=ExtractFileName(FilePath);
 //   CreThumb(240, 180);
    CreThumb(400, 300);
    SpeedButton2.Enabled := TRUE;
  end;
end;

procedure TFormGetPic.SpeedButton2Click(Sender: TObject);
begin

  IF SaveImage() then
  begin
    ModalResult := 1;
  end
  else
  begin
    application.MessageBox('数据保存失败！','提示信息',0)
  end;
//  JPStream := TMemoryStream.Create;
//  MyJPeg.Assign(Image1.Picture.Graphic);
//  MyJPeg.SaveToStream(JPStream);

end;

procedure TFormGetPic.SpeedButton3Click(Sender: TObject);
begin
  ModalResult := 2;
end;

procedure TFormGetPic.Button1Click(Sender: TObject);
begin
  hWndC := 0;
  try
    hWndC := capCreateCaptureWindowA('My Own Capture Window',
           WS_CHILD or WS_VISIBLE ,
           ScrollBox1.Left,
           ScrollBox1.Top,
           ScrollBox1.Width,
           ScrollBox1.Height,
           FormGetPic.Handle,
           0);
    if hWndC <> 0 then
    begin
      SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
      SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
      SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
      SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
      SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
      SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
  //SendMessage(hWndC, WM_CAP_SEQUENCE_NOFILE, 1, 0);
      SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
      SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
      Button1.Enabled:=false;
      Button2.Enabled:=true;
    end
    else
    begin
      application.MessageBox('连接摄像头失败！','错误信息',MB_ICONERROR);
    end;
  except
  end;
  application.ProcessMessages;
end;

procedure TFormGetPic.Button2Click(Sender: TObject);
var
  sFieldName:string;
  MBMP:TBitmap;
  MJPG:TJpegImage;
begin

  sFieldName:='D:\抓图';
  if not DirectoryExists(pchar(sFieldName)) then
  CreateDirectory(pchar(sFieldName),nil);

  sFieldName:=sFieldName+'\'+formatdateTime('yyyyMMddhhnnss',SGetServerDateTime(ADOQuery1));

  FileName:=ExtractFileName(sFieldName);
  if hWndC <> 0 then
  begin
    SendMessage(hWndC,WM_CAP_SAVEDIB,0,longint(pchar(sFieldName+'.BMP')));
    SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
    hWndC := 0;
    application.ProcessMessages;
    Button1.Enabled:=true;
    Button2.Enabled:=false;
    try
      MBMP:= TBitmap.Create;
      MJPG:= TJpegImage.Create;
      MBMP.LoadFromFile(pchar(sFieldName+'.BMP'));
      MJPG.assign(MBMP);
      Image1.Picture.Bitmap.Assign(MJPG);
      application.ProcessMessages;
      MJPG.SaveToFile(pchar(sFieldName+'.JPG'));
      CreThumb(240, 180);
    finally
      MBMP.Free;
      MJPG.Free;
      if Fileexists(pchar(sFieldName+'.BMP')) then DeleteFile(pchar(sFieldName+'.BMP'));
      FilePath:=sFieldName+'.JPG';
      FileName:=ExtractFileName(FilePath);
    end;
    SpeedButton2.Enabled:=true;
  end;
end;

procedure TFormGetPic.SpeedButton4Click(Sender: TObject);
var
  MJPG:TJpegImage;
  pathFile:string;
begin
  if Image1.Picture.Graphic=nil then exit;

  MJPG:= TJpegImage.Create;
  try
    SaveDialog1.FileName:=FileName;
    if SaveDialog1.Execute then
    begin
      if SaveDialog1.FileName<>'' then
      begin
        pathFile:=trim(SaveDialog1.FileName);

        IF (RightStr(UPPERCASE(pathFile),4)<>'.JPG') and (RightStr(UPPERCASE(pathFile),5)<>'.JPEG') then
        begin
          pathFile:=pathFile+'.JPG';
        end;
        MJPG.Assign(Image1.Picture.Graphic);
        if fileexists(pathFile) then
        begin
          if application.MessageBox(pchar('文件['+trim(pathFile)+']已存在，是否要替换它？'),'提示信息',MB_YESNO+mb_iconinformation+MB_DEFBUTTON2)=idyes then
          MJPG.SaveToFile(pathFile);
        end
        else
         MJPG.SaveToFile(pathFile);

      end;
    end;
  finally
    MJPG.Free;
  end;
end;

procedure TFormGetPic.SpeedButton5Click(Sender: TObject);
begin

  try
    with adoqueryImage do
    begin
      close;
      sql.Clear;
      sql.Add('select * from TP_File where WBID='+quotedstr(trim(fkeyNo)));
      open;
      if RecordCount>0 then
      begin
        edit;
        fieldByName(pat1).Value:=null;
        FieldByName(pic1).Value:=null;
        post;
        Image1.Picture.Assign(nil);
        Image2.Picture.Assign(nil);
      end;
    end;
  except
  end;
end;

end.
