求助高手(摄像头拍照后直接存入数据库)(100分)

  • 主题发起人 主题发起人 itdxx
  • 开始时间 开始时间
I

itdxx

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit3;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, DBCtrls, ExtDlgs,db,jpeg;

type
TForm3 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Button1: TButton;
SaveDialog1: TSaveDialog;
Button2: TButton;
Button3: TButton;
Image1: TImage;
OpenPictureDialog1: TOpenPictureDialog;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
hWndC : THandle;
CapturingAVI : bool;
public
{ Public declarations }
end;

var
Form3: TForm3;

implementation

uses Unit1;



{$R *.dfm}
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';

procedure TForm3.FormCreate(Sender: TObject);
begin
CapturingAVI := false;
hWndC := 0;
SaveDialog1.Options :=
[ofHideReadOnly, ofNoChangeDir, ofPathMustExist]
end;

procedure TForm3.FormShow(Sender: TObject);
begin
hWndC := capCreateCaptureWindowA('My Own Capture Window',
WS_CHILD or WS_VISIBLE ,
image1.Left,
image1.Top,
image1.Width,
image1.Height,
Form3.Handle,
0);
if hWndC <> 0 then
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);
//OpenVideo.Enabled :=false;
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if hWndC <> 0 then begin
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
hWndC := 0;
//OpenVideo.Enabled :=true;
end;
end;


procedure TForm3.Button2Click(Sender: TObject);
begin
form3.Close;
end;



procedure TForm3.Button3Click(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
MyJPEG := TJPEGImage.Create;
try
with MyJPEG do
begin
Assign(Image1.Picture.Graphic);
MS:=TMemoryStream.create;
SaveToStream(MS);
MS.Position:=0;
form1.ADOQuery1.Edit;
TBlobField(form1.ADOQuery1.FieldbyName('photo')).LoadFromStream(MS);
form1.ADOQuery1.Post;
messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
end;
finally
MyJPEG.Free;
end;
end;




end.
为什么保存出错呢?
 
我这样保存图片可以成功。
procedure savepicture;
var
BS:TADOBlobStream;
begin
with datam.DataM1,input_Form do
begin
Query1.Edit;
BS:=TADOBlobStream.Create(TMemoField(Query1.fieldbyname('图片')),bmWrite);
Image1.Picture.Graphic.SaveToStream(BS);
BS.Free;
Query1.Post;
end;
end;
 
procedure TForm3.Button3Click(Sender: TObject);
var
BS:TADOBlobStream;
begin
with form1.ADOQuery1 do
begin
Edit;
BS:=TADOBlobStream.Create(TMemoField(fieldbyname('photo')),bmWrite);
Image1.Picture.Graphic.SaveToStream(BS);
BS.Free;
Post;
end;
end;
不行还是会出错,好像是Image1.Picture.Graphic.SaveToStream(BS);错在这里
 
后退
顶部