原样拷贝了我一段程序,数据集是基于ClientDataSet的,但大体思路是这样的: procedure TfrmObjectPhoto.ShowPhoto(DataSet: TDataSet); var PicBlob: TStream; jpeg: TJpegImage; begin with DataModuleObjectManage.cdsPhoto do begin if UpdateStatus = usInserted then begin Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); SetImageProperty(); end else begin Edit; PicBlob := CreateBlobStream(FieldByName('Photo'), bmReadWrite); Post; if PicBlob.Size = 0 then Image1.Picture := nil else begin jpeg := TJpegImage.Create; jpeg.LoadFromStream(PicBlob); Image1.Picture.Assign(jpeg); SetImageProperty(); jpeg.Free; end; PicBlob.Free; end; end; end;
这是一段保存图象得代吗: procedure TfrmObjectPhoto.btnNewClick(Sender: TObject); var NewPhotoID: Integer; PhotoStream: TFileStream; ThumbStream: TMemoryStream; begin if OpenPictureDialog1.Execute then begin PhotoStream := TFileStream.Create(OpenPictureDialog1.FileName, fmShareDenyNone); ThumbStream := TMemoryStream.Create(); CreateThumbnail(PhotoStream, ThumbStream, 200, 200); with DataModuleObjectManage do begin SocketConnection1.AppServer.GetSequenceNo(FPhotoSequenceIndex, NewPhotoID); cdsPhoto.Append; cdsPhoto.Edit; cdsPhoto.FieldByName('PhotoID').AsInteger := NewPhotoID; cdsPhoto.FieldByName('ObjectID').AsInteger := FObjectID; cdsPhoto.FieldByName('Descript').AsString := '编号为' + IntToStr(NewPhotoID) + '的照片'; TBLOBField(cdsPhoto.FieldByName('Photo')).LoadFromStream(PhotoStream); TBLOBField(cdsPhoto.FieldByName('Thumbnail')).LoadFromStream(ThumbStream); cdsPhoto.Post; end; PhotoStream.Free; ThumbStream.Free; end; end;
我用ADO连接ACCESS数据库,在数据库里建了一个表,一个字段为自动增长的主健,另一个为OLE对象类型(相当于其他数据库的二进制类型)。 连接SQL SERVER是一样的。代码如下: if OpenDialog1.Execute then begin with ADOTable1 do begin Insert; TBlobField(FieldByName('Files')).LoadFromFile(OpenDialog1.FileName); Post; end; end;
这是我保存的一段代码,其中Dialog控件不要选用OpenPictureDialog,直接用OpenDialog,否则就无法查找到JPG的文件。procedure TForm1.BitBtn2Click(Sender: TObject); begin adotable1.Edit; (adotable1.FieldByName('zp') As TBlobField).LoadFromFile(s);//写文件 adotable1.post; end;procedure TForm1.DBGrid1DblClick(Sender: TObject); begin if adotable1.FieldbyName('zp').IsNull=false then//判断文件是否已经存入数据库 showmessage('ok!') else showmessage('go on!') end;Image1.Picture.Bitmap.Assign(TBlobField(table1.FieldByName('ZP'))); //取图片!
用TImage.Picture.LoadFromStream显示
truncated”,将2000510_6.jpg改为比较短的图片名就没有问题。什么原因?
但是jpg的有时会有错误,或Assign不上的问题!
试一下Assgin对应的picture 如果还不行
你可以用Dbimage的CopytoClipboard和pastefromclipboard
这个方法不会有问题,不过存储的jpg可能会变大,效率问题你需要考虑!
procedure TfrmObjectPhoto.ShowPhoto(DataSet: TDataSet);
var
PicBlob: TStream;
jpeg: TJpegImage;
begin
with DataModuleObjectManage.cdsPhoto do
begin
if UpdateStatus = usInserted then
begin
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
SetImageProperty();
end
else
begin
Edit;
PicBlob := CreateBlobStream(FieldByName('Photo'), bmReadWrite);
Post; if PicBlob.Size = 0 then
Image1.Picture := nil
else
begin
jpeg := TJpegImage.Create;
jpeg.LoadFromStream(PicBlob);
Image1.Picture.Assign(jpeg);
SetImageProperty();
jpeg.Free;
end; PicBlob.Free;
end;
end;
end;
procedure TfrmObjectPhoto.btnNewClick(Sender: TObject);
var
NewPhotoID: Integer;
PhotoStream: TFileStream;
ThumbStream: TMemoryStream;
begin
if OpenPictureDialog1.Execute then
begin
PhotoStream := TFileStream.Create(OpenPictureDialog1.FileName, fmShareDenyNone);
ThumbStream := TMemoryStream.Create();
CreateThumbnail(PhotoStream, ThumbStream, 200, 200); with DataModuleObjectManage do
begin
SocketConnection1.AppServer.GetSequenceNo(FPhotoSequenceIndex, NewPhotoID); cdsPhoto.Append;
cdsPhoto.Edit;
cdsPhoto.FieldByName('PhotoID').AsInteger := NewPhotoID;
cdsPhoto.FieldByName('ObjectID').AsInteger := FObjectID;
cdsPhoto.FieldByName('Descript').AsString := '编号为' + IntToStr(NewPhotoID) + '的照片';
TBLOBField(cdsPhoto.FieldByName('Photo')).LoadFromStream(PhotoStream);
TBLOBField(cdsPhoto.FieldByName('Thumbnail')).LoadFromStream(ThumbStream);
cdsPhoto.Post;
end; PhotoStream.Free;
ThumbStream.Free;
end;
end;
连接SQL SERVER是一样的。代码如下:
if OpenDialog1.Execute then
begin
with ADOTable1 do
begin
Insert;
TBlobField(FieldByName('Files')).LoadFromFile(OpenDialog1.FileName);
Post;
end;
end;
begin
adotable1.Edit;
(adotable1.FieldByName('zp') As TBlobField).LoadFromFile(s);//写文件
adotable1.post;
end;procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
if adotable1.FieldbyName('zp').IsNull=false then//判断文件是否已经存入数据库
showmessage('ok!')
else
showmessage('go on!')
end;Image1.Picture.Bitmap.Assign(TBlobField(table1.FieldByName('ZP')));
//取图片!