图象读出(100分)

  • 主题发起人 主题发起人 zcq16
  • 开始时间 开始时间
Z

zcq16

Unregistered / Unconfirmed
GUEST, unregistred user!
有一副Bmp图,让我以 Binary类型读入sqlserver数据库表Images的Image字段中,如何读出?
我读入时用的是文件流
 
还用文件流就成了。
var
Buf:TMemoryStream;
begin
Buf:=TMemoryStream.Create;
(ADOTable1.FieldByName('image') as TBlobField).SaveToStream(buf);
Buf.SaveToFile('d:/test.bmp'); <--换成你想要进行的操作,如果仅是将图片保存为文件,就不需要这么麻烦,上一句改为savetofile就可以了。
Buf.Free;
 
我只是想看到这一副图片,就是把这个字段以图象的方式显示出来
 
而且运行你的代码时出错了,提示"invalidate class typecast"
 
什么?不会吧?我运行了的。
要显示BMP,最简单的方法是直接用dbimage控件。
或者
Image1.Picture.Bitmap.Assign(ADOTable1.FieldByName('image'));
 
什么时候出现错误提示的?
其它的设置对吗?
 
代码又出错了。说
'Cant`t assign a tbytefield to a tbitmap'
我图象用的是Binary字段类型
 
嗯,这个问题我说过好几次了。
在sql server中除非明确了解数据大小的情况下不要用binary字段。
因为它是有长度限制的。它最长可以放大约8K的数据。
所以把它段改为image类型就可以了。
 
远帆下正确的!
 
远帆大哥,下列代码中,with Tfilestream.Create(filename,fmopenread) do
try
begin
setlength(Result,size);
read(pointer(Result)^,size);
end;
finally
free;
end;
setlength;
和read(pointer(Result)^,size);是什么意识?有何作用?

 
var
buf:TMemoryStream;
begin
ADOTable1.Append;
buf:=TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(buf);
(ADOTable1.FieldByName('image') as TBlobField).LoadFromStream(buf);
buf.Free;
ADOTable1.Post;

这里用一个内存流buf(tmemorystream)做了一下中转。
我不太清楚有没有更简单的方法。
 
你前面没有贴出result的声明。
从你的代码来看可能是array of byte类型。
setlength(Result,size);是分配result的内存单元为size字节,也就是文件流的长度。
read(pointer(Result)^,size);是将文件读到result的内存单元中。由于read的第一个参数必需为一段buffer区域
它这里先用pointer(result)得到result的内存指针,然后再通过该指针得到地址^
但是我觉得这段代码做了无用功。完全可以read(result,size)
可能与result变量的声明有关。要看其它代码才能确定。

 
这是不是一段函数中间的部分?
result是隐含声明是不是?如果是这样,我也学了一招:)
还可以这样用!
 
完全代码是这样的:
procedure TForm1.Button1Click(Sender: TObject);
var
sfilename:string;
function BlobContentToString(const filename:string):string;
begin
with Tfilestream.Create(filename,fmopenread) do
try
begin
setlength(Result,size);
read(pointer(Result)^,size);
end;
finally
free;
end;
end;
begin
opendialog1.Execute;
sfilename:=opendialog1.FileName;
adotable1.Edit;
adotable1.FieldByName('image').AsString:=blobcontenttostring(sfilename);
adotable1.Post;
end;
 
这一段代码可以把任意图象存入数据库,但是你给我的那一段代码好象只能存入Bmp图吧?
 
my god!
原来你的要求是这个。
存文件还用那么麻烦吗?
(ADOTable1.FieldByName('image') as TBlobField).LoadFromfile(filename);
别说是图像,任意文件也行啊。
再说了,我前面的那个是直接用流,没有文件,实际上用流也是可以存入任意数据的。
 
我也同意远帆的
 
接受答案了.
 

Similar threads

后退
顶部