用数据流存储图片 ( 积分: 50 )

  • 主题发起人 主题发起人 jklpoi
  • 开始时间 开始时间
J

jklpoi

Unregistered / Unconfirmed
GUEST, unregistred user!
请教各位高手 用delphi6+sqlserver2000作程序时
遇到当存储图片太多(*.jpeg)时会出现运行速度慢;
询问了一下有人建议我用数据流存储,但上网找了半天
没有发现,哪位有这方面的代码?先谢谢各位了
 
请教各位高手 用delphi6+sqlserver2000作程序时
遇到当存储图片太多(*.jpeg)时会出现运行速度慢;
询问了一下有人建议我用数据流存储,但上网找了半天
没有发现,哪位有这方面的代码?先谢谢各位了
 
这是我在网上找到的一段代码,但是运行时出现问题,请教各位是什么地方不对
procedure TForm1.Button1Click(Sender: TObject); //插入圖片過程
var
testStream:TMemoryStream;
begin
try
testStream := TMemoryStream.Create; //創建內存流
Image1.Picture.Graphic.SaveToStream(testStream);  //將圖片保存至內存流中
adoquery1.Close;
adoquery1.SQL.Clear;
adoQuery1.SQL.Add('Insert into test (id,photo) values (:id,:photo)'); //進行插入操作
adoquery1.Parameters.ParamByName('id').Value := '003';
adoQuery1.Parameters.ParamByName('photo').LoadFromStream(testStream,ftBlob); //讀取保存的內存圖
adoquery1.ExecSQL;
finally
testStream.Free;   //釋放內存流
end;
end;

procedure TForm1.Button2Click(Sender: TObject); //讀取圖片過程
var
mStream:TMemoryStream;
JpgFile:TjpegImage;
begin
if not ADOQuery1.FieldByName('photo').IsNull then begin ;
mStream:=TMemoryStream.Create ;
JpgFile:=TjpegImage.Create ;
TBlobField(ADOQuery1.FieldByName('photo')).SaveToStream(mStream);  //顯示的轉換為BlobFiled並保存至內存流
mStream.Position :=0;
jpgfile.LoadFromStream(MStream);
image2.Picture.Assign(JpgFile);
end
else begin
image2.Picture :=nil;
end;
end;
 
怎么没有人回答呢
是哪不对请你指出来.
我急呀!!!!!!!!
 
看不出问题在哪儿,至少跟踪一下看看嘛!知道哪一行出了问题再想解决的办法
 
首先看看你photo字段是不是image型
 
还有从SQLSERVER返回了什么错误信息
 
请教各位高手 用delphi6+sqlserver2000作程序时
遇到当存储图片太多(*.jpeg)时会出现运行速度慢;??
询问了一下有人建议我用数据流存储, ???

什么意思,不明白?

本来就用流,不用流还能用什么?还有,你的表的字段应该是 image类型。
参考
Stream:=qry.CreateBlobStream(qry.FieldByName('grpContext'), bmWrite);
try
Stream.WriteComponent(TV);
finally
Stream.Free;
qry.Post;
qry.Close;
end;
 
表的字段没有问题。
楼上的朋友你能将流的代码写的详细些么?谢谢!!

运行时出现的问题:[Error] Unit1.pas(40): Illegal character in input file: ' ' ($A1A1)
请问这是什么意识?
 
我在做存储图片的时候也遇到的类似的问题,你的问题解决了吗?网上的代码似乎不太管用啊
 
If opd.Execute Then
With DM.WareSaveImage Do
Begin
Close;
Parameters[0].Value:=DM.Ware.FieldByName('code').AsString;
Open;
Edit;
TBlobField(FieldByName('image')).LoadFromFile(opd.FileName);
Post;
End;
 
现在的问题不是存储,而是怎样读取了.
用的是dbgrid显示表中的内容,用下面的代码只能显示出表中第一行中的图片,
当选择另一行时,不能够显示.
请问各位怎样显示表中的每一行的图片.
procedure TForm1.Button2Click(Sender: TObject); //讀取圖片過程
var
mStream:TMemoryStream;
JpgFile:TjpegImage;
begin
if not ADOQuery1.FieldByName('photo').IsNull then begin ;
mStream:=TMemoryStream.Create ;
JpgFile:=TjpegImage.Create ;
TBlobField(ADOQuery1.FieldByName('photo')).SaveToStream(mStream);  //顯示的轉換為BlobFiled並保存至內存流
mStream.Position :=0;
jpgfile.LoadFromStream(MStream);
image2.Picture.Assign(JpgFile);
end
else begin
image2.Picture :=nil;
end;
end;
 
:[Error] Unit1.pas(40): Illegal character in input file: ' ' ($A1A1)
这是你的程序代码中有非法字符,一般是个中文的空格,
你连编译都过不去,
先检查代码的行头行尾,删去空白部分
上面的代码我只看到你create了流,没有free
 
procedure TEditForm.ComboBoxEx1Exit(Sender: TObject);
var Mybmp : TBitmap;
Mystream : TMemoryStream;
begin
Mybmp:=TBitmap.Create;
Mystream:=TMemoryStream.Create;
ImageList1.GetBitmap(ComboBoxEx1.ItemIndex,Mybmp);
Mybmp.SaveToStream(MyStream);
MyStream.Position:=0;
with DM1.ADODataSet1 do try
Edit;
TBlobField(FieldByName('字段名')).LoadFromStream(MyStream);
except
end;
Mystream.Free;
Mybmp.Free;
end;

这个应该可以的!不要忘记加分!!
 
楼上的朋友DM1代表什么
 
dm1就是datamodule是放数据空控件的地方。
 
可以以文件的形式保存啊
 
显示的时候用invalidate重新刷新一下界面。
 
存:
Var
mstr:TMemoryStream;

mstr:=TMemoryStream.Create();
mstr.LoadFromFile(sFn);
mstr.Position:=0;
TBlobField(fieldbyname('oFileName')).LoadFromStream(mstr);
Post;
mstr.Free;

取:
Var
mstr:TMemoryStream;

mstr:=TMemoryStream.Create();
mstr.LoadFromFile(sFn);
mstr.Position:=0;
TBlobField(fieldbyname('oFileName')).SaveToStream(mstr);
Post;
mstr.Free;
 
我也遇到此问题.解决的方法是把原来打开图片的表.设为查询.
采用查询会速度快的.
 
后退
顶部