高分悬赏!怎么把保存在数据库中的JPG图像读出来?DELPHI 5

turbopeng 2002-06-06 04:16:36
ADO + ACCESS。OLE字段。
下面的代码是我保存进数据库的代码。请问怎么才能读出来呢并显示在IMAGE中呢?因为图片众多,所以不能保存成本地文件,要用流来解决,可是我折腾了一下午,还是没有解决。望高手帮忙!我用的是 5 ,不能用 6。如能解决,必然给分!

procedure TForm1.Button1Click(Sender: TObject);
var
photo: TMemoryStream;
begin
ADOTable1.Append;
if OpenDialog1.Execute then
Image1.Picture.LoadFromFile(OpenDialog1.FileName);
photo := TMemoryStream.Create;
Image1.Picture.Graphic.SavetoStream(photo);
TBlobField(ADOTable1.Fieldbyname('pic')).LoadFromStream(photo);
ADOTable1.Post;
photo.Clear;
end;
...全文
70 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
turbopeng 2002-06-06
  • 打赏
  • 举报
回复
我这些时间一直都没有弄COM+,所以不会呀~~~:(
turbopeng 2002-06-06
  • 打赏
  • 举报
回复
再次感谢楼上的诸位!
kplchx 2002-06-06
  • 打赏
  • 举报
回复
因为存放图片的内容还含有图片文件的路径和文件名称,因此读出时应数据流
应该处理,从其JPG的标志开始截取数据流,其标志是'FFD8'
下面是个例子 access+delphi+ado

Chapter three of the free
Delphi Database Course for beginners.
Displaying images (BMP, JPEG, ...) inside
an Access database with ADO and Delphi.

For the .zip file of this project click here.

}

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons, ExtCtrls, StdCtrls, Db, ADODB, Grids, DBCtrls, DBGrids;

type
TForm1 = class(TForm)
ADOTable1: TADOTable;
DataSource1: TDataSource;
btnShowImage: TButton;
ADOImage: TImage;
ADOTable1Name: TWideStringField;
ADOTable1Description: TWideStringField;
ADOTable1Author: TWideStringField;
ADOTable1Type: TWideStringField;
ADOTable1Size: TFloatField;
ADOTable1Cost: TBCDField;
ADOTable1DateUpl: TDateTimeField;
ADOTable1Picture: TBlobField;
DBGrid1: TDBGrid;
procedure btnShowImageClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


const
JPEGstarts = 'FFD8';
BMPstarts = '424D'; //BM

var
Form1: TForm1;

implementation
uses jpeg;
{$R *.DFM}

function JpegStartsInBlob (PicField:TBlobField):integer;
var
bS : TADOBlobStream;
buffer : Word;
hx : string;
begin
Result := -1;
bS := TADOBlobStream.Create(PicField, bmRead);
try
while (Result = -1) and (bS.Position + 1 < bS.Size) do
begin
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'FF' then begin
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'D8' then Result := bS.Position - 2
else if hx = 'FF' then bS.Position := bS.Position-1;
end; //if
end; //while
finally
bS.Free
end; //try
end;

procedure TForm1.btnShowImageClick(Sender: TObject);
var
bS : TADOBlobStream;
Pic : TJpegImage;
begin
bS := TADOBlobStream.Create(AdoTable1Picture, bmRead);
try
bS.Seek(JpegStartsInBlob(AdoTable1Picture), soFromBeginning);
Pic:=TJpegImage.Create;
try
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Pic;
finally
Pic.Free;
end;
finally
bS.Free
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
var sDBPath, sCons: string;
begin
//change the sDBPath to point to your database!
sDBPath := 'c:\!Gajba\About\aboutdelphi.mdb';
sCons := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + sDBPath + ';Persist Security Info=False';

ADOTable1.ConnectionString := sCons;
ADOTable1.TableName := 'Applications';
DataSource1.DataSet := ADOTable1;
DBGrid1.DataSource := DataSource1;

ADOTable1.Active:=True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ADOTable1.Active:=False;
end;


//Extra!! save JPG to table
procedure SaveJpegToTable(Table: TADOTable; PicField:TBlobField; sPicPath: string);
{
Usage:

SPicFileName := 'C:\!gajba\cdcovers\cdcover1.jpg';
SaveJpegToTable(ADOTable1, ADOTable1Picture, SPicFileName);
}
var
fS : TFileStream;
begin
fs:=TFileStream.Create(sPicPath, fmOpenRead);
try
Table.Edit;
PicField.LoadFromStream(fs);
Table.Post;
finally
fs.Free;
end;
end;

Tine2 2002-06-06
  • 打赏
  • 举报
回复
我想请教你一个问题:DCOM服务器的CallBack的技术怎样实现?
就是在Client端定义一个interface,然后让Server端能调用。
turbopeng 2002-06-06
  • 打赏
  • 举报
回复
呵呵,知道啊。我现在不能用QQ啊。:(
Tine2 2002-06-06
  • 打赏
  • 举报
回复
你好,我是Tine.知道吗?
lxl 2002-06-06
  • 打赏
  • 举报
回复
试试这个:
var
jpeg:tjpegimage;
stream :TMemoryStream;
begin
if adoquery1jpg.BlobSize>0 then
begin
jpeg:=tjpegimage.Create;
stream :=TMemoryStream.Create;
tblobfield(adoquery1.FieldByName('jpg')).savetostream(stream);
Stream.Seek(0,soFromBeginning);
jpeg.loadfromstream(stream);
image.Picture.Bitmap.Assign(jpeg);
jpeg.Free;
stream.Free;
end
else
image.Picture:=nil;
end;
turbopeng 2002-06-06
  • 打赏
  • 举报
回复
var
jpg: TJpegImage;
begin
jpg := TJpegImage.Create;
jpg.Assign(ADOTable1.Fieldbyname('pic'));
Image1.Canvas.Draw(0, 0, jpg); // 这里出错,报告说是只能画BITMAP
...
end;
netlib 2002-06-06
  • 打赏
  • 举报
回复
直接(query1.FieldByName('img') as TBlobField).savetofile('E:\jjj.jpg')
Mudeen 2002-06-06
  • 打赏
  • 举报
回复
use jpeg
turbopeng 2002-06-06
  • 打赏
  • 举报
回复
我原来就是这么写的,但是显示“JPEG ERROR #41”
netlib 2002-06-06
  • 打赏
  • 举报
回复
(query1.FieldByName('img') as TBlobField).SavetoStream(photo);
Image1.Picture.Graphic.loadfromstream(photo);

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧