2,497
社区成员
发帖
与我相关
我的任务
分享
procedure TForm1.ShowPic;
var
vStr:TADOBlobStream;
vTmp,vTmp1,vPicType:string;
vtmpPath:PChar;
begin
Image1.Image.Graphic:=nil;//清空图像控件里的图像
vstr:=TADOBlobStream.Create(TBlobField(QueryDetail.FieldByName('Pic')),bmRead); //创建BlobStream,设定Pics字段为Blob字段,并设为只读
if vstr.Size=0 then //Stream的大小为0说明没有图像,退出
begin
exit;
end;
vPicType:=CheckImgType(vStr); //判断图像类型
vstr.Position:=0; //指针移动到开头
GetMem(vtmpPath,MAX_PATH); //获取临时目录
GetTempPath(MAX_PATH,vtmpPath);//获取临时目录
vTmp:=StrPas(vtmpPath); //获取临时目录
FreeMem(vtmpPath);//释放变量
vTmp:=vTmp + PubData1.GetGUIDString + '.' + vPicType; //将临时目录和文件名合成全路径文件名
TBlobField(QueryDetail.FieldByName('Pic')).SaveToFile(vTmp); //从Blob字段读取图像数据保存到临时文件
while not FileExists(vTmp) do
begin
Sleep(100);
Application.ProcessMessages;
end;
Image1.Picture.LoadFromFile(vTmp); //图像控件读取临时文件
DeleteFile(vTmp); //删除临时文件
end;
function TForm1.CheckImgType(Stream:TStream):String;
var
Buffer:Word;
i:integer;
begin
try
Stream.Position := 0; //移动指针到最开头的位置
if Stream.Size = 0 then //如果文件大小等于0,那么
begin
Result:='';
Exit;
end;
Stream.ReadBuffer(Buffer,2); //读取文件的前2个字节,放到Buffer里面
if Buffer=$4D42 then //如果前两个字节是以4D42[低位到高位]
Result:='BMP' //那么这个是BMP格式的文件
else if Buffer=$D8FF then //如果前两个字节是以D8FF[低位到高位]
Result:='JPEG' //........一样 下面不注释了
else if Buffer=$4947 then
Result:='GIF'
else if Buffer=$050A then
Result:='PCX'
else if Buffer=$5089 then
Result:='PNG'
else if Buffer=$4238 then
Result:='PSD'
else if Buffer=$A659 then
Result:='RAS'
else if Buffer=$DA01 then
Result:='SGI'
else if Buffer=$4949 then
Result:='TIFF'
else //如是其他类型的文件的话,直接显示错误
Result:='';
except
Result:='Err';
end;
procedure TForm1.ActionAddPicExecute(Sender: TObject);
begin
inherited;
if not QueryDetail.Active then
Exit;
with OpenPictureDialog1 do
begin
if not Execute then Exit;
Image1.Picture.Graphic:=nil;
Image1.Picture.LoadFromFile(FileName);//加载图片
QueryDetail.Edit;
TBlobField(QueryDetail.FieldByName('Pic')).LoadFromFile(FileName);//重点这里,Image类型字段加入文件
QueryDetail.Post;
end;
end;