关于在数据库中存取图象的问题(50分)

  • 主题发起人 主题发起人 settingsun
  • 开始时间 开始时间
S

settingsun

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库是SQL SERVER,其中有几个字段是存取图象的,我想存成jpg格式的,应该怎么做,
最好给个例子参考一下,谢谢。
 
存取jpg代码如下:
procedure TForm1.btnLoadImageClick(Sender: TObject);
var
sFileName : string;

function BlobContentToString(const AFileName : string) : string;
begin
with TFileStream.Create(AFileName, fmOpenRead) do
try
SetLength(Result, Size);
Read(Pointer(Result)^, Size);
finally
Free;
end;
end;

begin
if OpenDialog1.Execute then
begin
sFileName := OpenDialog1.FileName;
with ADOTable1 do
begin
Open;
Insert;
FieldByName('Name').AsString := Edit1.Text;
FieldByName('Photo').AsString := BlobContentToString(sFileName);
Post;
end;
end;
end;

procedure TForm1.btnShowClick(Sender: TObject);
var
BS : TADOBlobStream;
JpegImage : TJpegImage;
sFileName : string;
begin
JpegImage := TJpegImage.Create;
BS := TADOBlobStream.Create(TBlobField(ADOTable1.FieldByName('Photo')), bmRead);
try
JpegImage.LoadFromStream(BS);
Image1.Picture.Assign(JpegImage);
sFileName := ExtractFilePath(Application.ExeName) + 'tmpBlob';
sFileName := sFileName + '.jpg';
BS.SaveToFile(sFileName);
//OleContainer1.CreateObjectFromFile(sFileName, False);
//Image1 := TImage.Create(Self);
//Image1.Picture.Graphic.LoadFromStream(BS);
finally
JpegImage.Free;
BS.Free;
end;
end;
 
procedure TForm1.SaveToClick(Sender: TObject);
Var
BlobStream:TBlobStream;
JpegImage:TJpegImage;//TJpegImage
begin
try
with Adotable1 do
try
JpegImage:=TJpegImage.Create;
//
BlobStream:=TBlobStream.Create(TBlobField(FieldByName('pic')),bmWrite);
BlobStream.Position:=0;
JpegImage:=TJpegImage(image1.Picture.Graphic);
JpegImage.SaveToStream(BlobStream);
finally
if Not Assigned(BlobStream) then BlobStream.Free;
if Not Assigned(JpegImage) then JpegImage.Free;
end;
except
end;
end;
 
现在可以存入数据库,但是显示的时候有些问题。
如果源图象是BMP格式的存入数据库,那么显示的时候应如下

BS : TBlobStream;
JpegImage : TJpegImage;
B:TBitmap;
begin
B:=TBitmap.create;
JpegImage := TJpegImage.Create;
BS := TBlobStream.Create(TBlobField(query1.FieldByName('Photo')), bmRead);
try
B.LoadFromStream(BS);
Image1.Picture.Assign(B);


如果源图象是JPG格式的,那么就用你们提供的方法
JpegImage.LoadFromStream(BS);
Image1.Picture.Assign(JpegImage);

如果数据库中已经存了不同类型的图片,如何正确显示它们。
 
你要么在增加一个字段,保存图片的类型
或这你自己去分析图片数据的内容,图片内容中有图片的类型信息
 
还有没有其他的方法啊
 
TBlobField(Fields).SaveToFile(...)
TBlobField(Fields).LoadFromFile(...)
这些都可以,不管什么类型的图片
不过,如果你用SQL Server,好像有多个图片字段的时候,
使用Query的Params进行图片的插入的时候,会有问题,可以使用Table就可以了
如果是MySQL,则有图片字段的表,要有primary key才能进行正常的操作
 
读图片
var
jpgf: TJPEG;
stream: TMemoryStream;

stream := TMemoryStream.Create;
jpeg := TJPEG.Create;
(query.fieldbyname('jpeg') as TBlobField).SaveToStream(stream);
jpeg.LoadFromStream(stream);

存图片
jpeg.SaveToStream(stream);
(query.fieldbyname('jpeg') as TBlobField).LoadFromStream(stream);
 
增加一个字段记取图象的格式是最好的解决方案,我的项目全是这样做的,
不仅仅局限于图形文件
 
多人接受答案了。
 
后退
顶部