这是我以前做过的项目中的部分代码,能存储bmp和jpg格式图片,在数据库要设一个字段来判断存入的图片是否为:bmp格式。 procedure Tfrm_Main.BTNSelectPhotoClick(Sender: TObject); begin if OpenPictureDialog1.Execute then Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);end;procedure Tfrm_Main.BtnSaveToDBClick(Sender: TObject); var ext:string; begin if image1.Picture.Graphic <>nil then begin try DM.ADOConnection.BeginTrans ; DM.ADODataSet_classMate.Edit ; DM.ADODataSet_classMate.FieldByName('相片').Assign(image1.Picture.Graphic); //以下记录保存到数据库的图像格式 ext:=extractfileext(openpicturedialog1.FileName); if uppercase(ext) = '.BMP' THEN DM.ADODataSet_classMate.FieldByName('isbmp').Value :=1 ELSE IF (UPPERCASE(EXT) = '.JPEG') OR (UPPERCASE(EXT) = '.JPG') THEN DM.ADODataSet_classMate.FieldByName('isbmp').Value :=0; DM.ADODataSet_classMate.Post ; DM.ADOConnection.CommitTrans ; except DM.ADOConnection.RollbackTrans ; showmessage('图片保存失败!'); end;//try end; end;
if (uppercase(s1) ='.JPG' ) or (uppercase(s1)='.JPEG') // 图片格式一定要大写 THEN begin pjpg.LoadFromFile(s ); pic:=TMemoryStream.Create; pjpg.SaveToStream(pic); image1.Picture.Bitmap.Assign(pjpg); pic.Position:=0; adoquery1.Insert ; adoquery1.FieldByName('borj').VALUE := 2; TBlobField(adoquery1.FieldByName('pic')).LoadFromStream(pic); adoquery1.post; pic.Free; pjpg.free; end ; if (uppercase(s1)='.BMP') then begin edit1.Text :=uppercase(s1); image1.Picture.LoadFromFile(s); adoquery1.Insert ; adoquery1.FieldByName('pic').Assign(image1.Picture.Graphic); adoquery1.FieldByName('borj').VALUE := 3; adoquery1.Post ; end; end; procedure TForm1.BitBtn1Click(Sender: TObject); var jpeg:tjpegimage; begin image1.Picture.Graphic :=nil; with adoquery1 do begin if adoquery1.FieldByName('borj').Value =3 // bmp then image2.Picture.Bitmap.Assign(fieldbyname('pic')) ; if adoquery1.FieldByName('borj').Value =2 //jpge; then begin jpeg:=tjpegimage.Create ; try jpeg.Assign(adoquery1.FieldByName('pic') ); image2.Picture.Graphic:=jpeg; finally jpeg.Free ; end; end; end ; end;end.
to boytomato(深爱一人叫颖的女孩!) 多谢你的方法,我现在将文件里的图片存入数据库没有问题了,但是我所需要的不是将文件里的图片存到数据库,而是要能在程序运行后,可以随时用抓图的方法获得图片,并将其存入数据库中,也就是说要在不知道文件路径的情况下将图片存到数据库中,请问你有什么办法吗?也麻烦其他高手帮忙指点,多谢了!
procedure Tfrm_Main.BTNSelectPhotoClick(Sender: TObject);
begin
if OpenPictureDialog1.Execute then Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);end;procedure Tfrm_Main.BtnSaveToDBClick(Sender: TObject);
var
ext:string;
begin
if image1.Picture.Graphic <>nil then
begin
try
DM.ADOConnection.BeginTrans ;
DM.ADODataSet_classMate.Edit ;
DM.ADODataSet_classMate.FieldByName('相片').Assign(image1.Picture.Graphic);
//以下记录保存到数据库的图像格式
ext:=extractfileext(openpicturedialog1.FileName);
if uppercase(ext) = '.BMP' THEN
DM.ADODataSet_classMate.FieldByName('isbmp').Value :=1
ELSE IF (UPPERCASE(EXT) = '.JPEG') OR (UPPERCASE(EXT) = '.JPG') THEN
DM.ADODataSet_classMate.FieldByName('isbmp').Value :=0;
DM.ADODataSet_classMate.Post ;
DM.ADOConnection.CommitTrans ;
except
DM.ADOConnection.RollbackTrans ;
showmessage('图片保存失败!');
end;//try
end;
end;
//其中有些地方不是太严密,回去修改下。。
//delphi7+ sql2000通过.可以保存jpeg,jpg,bmp三种格式。unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg,DB, ADODB, ExtCtrls, Buttons, Grids, DBGrids,
DBCtrls;type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
Button1: TButton;
OpenDialog1: TOpenDialog;
Edit1: TEdit;
Image1: TImage;
Image2: TImage;
BitBtn1: TBitBtn;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
ADOQuery1pic: TBlobField;
ADOQuery1borj: TStringField;
procedure Button1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
s:string;
s1:string;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
bitmap1:tbitmap;
pjpg:tjpegimage;
pic:TMemoryStream;begin
pjpg:=tjpegimage.Create;
if opendialog1.Execute
then
s:=opendialog1.FileName ;
s1:=extractfileext(s);
if (uppercase(s1) ='.JPG' ) or (uppercase(s1)='.JPEG') // 图片格式一定要大写
THEN
begin
pjpg.LoadFromFile(s );
pic:=TMemoryStream.Create;
pjpg.SaveToStream(pic);
image1.Picture.Bitmap.Assign(pjpg); pic.Position:=0;
adoquery1.Insert ;
adoquery1.FieldByName('borj').VALUE := 2;
TBlobField(adoquery1.FieldByName('pic')).LoadFromStream(pic);
adoquery1.post;
pic.Free;
pjpg.free;
end ; if (uppercase(s1)='.BMP') then begin
edit1.Text :=uppercase(s1); image1.Picture.LoadFromFile(s);
adoquery1.Insert ;
adoquery1.FieldByName('pic').Assign(image1.Picture.Graphic);
adoquery1.FieldByName('borj').VALUE := 3; adoquery1.Post ;
end;
end; procedure TForm1.BitBtn1Click(Sender: TObject); var
jpeg:tjpegimage;
begin
image1.Picture.Graphic :=nil;
with adoquery1 do
begin
if adoquery1.FieldByName('borj').Value =3 // bmp
then
image2.Picture.Bitmap.Assign(fieldbyname('pic')) ; if adoquery1.FieldByName('borj').Value =2 //jpge; then
begin
jpeg:=tjpegimage.Create ;
try
jpeg.Assign(adoquery1.FieldByName('pic') );
image2.Picture.Graphic:=jpeg;
finally
jpeg.Free ;
end;
end; end ;
end;end.
同意!我就是这样做的!
还可以!
bmp.loadfrimfile('youfilename');
adoquery1.close;
adoquery1.sql.clear;
adoqury1.sql.add('insert into youtablename values(:p1,:p2,:p3');
adoqury1.parameter.parabyname('p1').value:=edit1.text;
adoquery1.parameter.parabyname('p2').value:=edit2.text;
adoquery1.parameter.parabyname('p3').assign(bmp);
try
adoquery1.excesql;
except
end;
或者直接存路径也可,只是网路路径你得保存主机名和路径
而且还得解析出真正得路径来
ADOQuery1pic: TBlobField;
ADOQuery1borj: TStringField;
这是哪里来的组件?????
var
Simage:TMemoryStream;
begin
Simage:=TMemoryStream.Create;
Simage.LoadFromFile('c:\aaa.bmp');
Simage.Position:=0;
try
ADOQuery.Open;
ADOQuery.Append;
TBlobField(ADOQuery.FieldbyName('Photo')).LoadFromStream(Simage);
ADOQuery.Post;
Simage.Free;
except
MessageDlg('保存图像失败,请重试!', mtInformation,[mbOK],0);
end;end;
////////////////////////////////////////////////////////////////////////////////////////////procedure TForm1.Button3Click(Sender: TObject);
var
bmp : TBitMap;
begin
if OpenDialog1.Execute then
begin
bmp := TBitMap.Create;
bmp.LoadFromFile(OpenDialog1.FileName);
Image1.Picture.Bitmap := bmp;
bmp.Free;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
MaxNo : Integer;
MStream:TMemoryStream;
begin
With DataModule1.Query1 do
begin
Close;
SQL.Clear;
SQL.Add('select Max(No) from testblob');
if Not Prepared then Prepared := True;
Open;
MaxNo := Fields[0].AsInteger;
end;
MStream := TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(MStream);
ShowMessage(IntToStr(MStream.Size));
MStream.Position := 0;
DataModule1.Table1.Insert;
DataModule1.Table1.FieldByName('No').AsInteger := MaxNo + 1;
//DataModule1.Table1.Fields[1].Assign(Image1.Picture.Bitmap);
//TBlobField(DataModule1.Table1.FieldByName('Image')).LoadFromStream(MStream);
try
DataModule1.Table1.Post;
except
ON E:Exception do
begin
MStream.Free;
Showmessage(E.Message);
Exit;
end;
end;
MStream.Free;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
DataModule1.Table1.Delete;
end;procedure TForm1.Button4Click(Sender: TObject);
var
BlobS : TBlobStream;
begin
Image1.Hide;
//Image1.Picture.Bitmap.FreeImage;
BlobS := TBlobStream.Create(TBlobField(DataModule1.Table1.FieldByName('Image')),bmRead);
Image1.Picture.bitmap.LoadFromStream(BlobS);
Image1.Refresh;
Image1.Show;
BlobS.Free;
end;procedure TForm1.Button5Click(Sender: TObject);
var
MaxNo : Integer;
MStream:TStringStream;
begin
With DataModule1.Query1 do
begin
Close;
SQL.Clear;
SQL.Add('select Max(No) from testblob');
if Not Prepared then Prepared := True;
Open;
MaxNo := Fields[0].AsInteger;
end;
MStream := TStringStream.Create('');
Image1.Picture.Bitmap.SaveToStream(MStream); //注意这里
ShowMessage(IntToStr(MStream.Size));
MStream.Position := 0;
DataModule1.Query1.Active := False;
DataModule1.Query1.Close;
DataModule1.Query1.SQL.Clear;
DataModule1.Query1.SQL.Add('Insert into testblob values(:No,:Image)');
DataModule1.Query1.ParamByName('No').AsInteger := MaxNo + 1;
DataModule1.Query1.ParamByName('Image').AsBlob := MStream.DataString;
DataModule1.Query1.Prepare;
DataModule1.Query1.ExecSQL;
DataModule1.Table1.Refresh;
end;像这样子试试
如果是jpg,就先将它转换为bmp,再保存.
MemStream: TMemoryStream;
begin
if OpenPictureDialog1.Execute then
begin
for I := 0 to OpenPictureDialog1.Files.Count - 1 do //添加文件
begin
MemStream := TMemoryStream.Create; //创建流
try
MemStream.LoadFromFile(OpenPictureDialog1.Files[I]); //将文件读到流中去
MemStream.Seek(0, soFromBeginning);
Compress(MemStream); //压缩文件
MemStream.Seek(0, soFromBeginning);
with ADOQuery2 do
begin
Append;
TBlobField(FieldByName('图片)).LoadFromStream(MemStream);
ADOQuery2.Post;
end;
finally
MemStream.Free;
end;
end;
end;//*****************************************COMPRESS函数
procedure Compress(var CompressedStream: TMemoryStream);
var
SourceStream: TCompressionStream;
DestStream: TMemoryStream;
Count: Integer;
Begin
Count := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create(clMax, DestStream);
Try
CompressedStream.SaveToStream(SourceStream);
SourceStream.Free;
CompressedStream.Clear;
CompressedStream.WriteBuffer(Count, SizeOf(Count));
CompressedStream.CopyFrom(DestStream, 0);
finally
DestStream.Free;
end;
end;建议这样使用:)))
compress后怎么读出来啊
多谢你的方法,我现在将文件里的图片存入数据库没有问题了,但是我所需要的不是将文件里的图片存到数据库,而是要能在程序运行后,可以随时用抓图的方法获得图片,并将其存入数据库中,也就是说要在不知道文件路径的情况下将图片存到数据库中,请问你有什么办法吗?也麻烦其他高手帮忙指点,多谢了!