高分悬赏!怎么把保存在数据库中的JPG图像读出来?DELPHI 5
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;
问题点数:99、回复次数:12Top
1 楼netlib(河外孤星)回复于 2002-06-06 16:22:12 得分 0
(query1.FieldByName('img') as TBlobField).SavetoStream(photo);
Image1.Picture.Graphic.loadfromstream(photo);Top
2 楼turbopeng(济元)回复于 2002-06-06 16:29:58 得分 0
我原来就是这么写的,但是显示“JPEG ERROR #41”Top
3 楼Mudeen(诸神的黄昏)回复于 2002-06-06 16:33:57 得分 0
use jpegTop
4 楼netlib(河外孤星)回复于 2002-06-06 16:35:55 得分 0
直接(query1.FieldByName('img') as TBlobField).savetofile('E:\jjj.jpg')Top
5 楼turbopeng(济元)回复于 2002-06-06 16:37:15 得分 0
var
jpg: TJpegImage;
begin
jpg := TJpegImage.Create;
jpg.Assign(ADOTable1.Fieldbyname('pic'));
Image1.Canvas.Draw(0, 0, jpg); // 这里出错,报告说是只能画BITMAP
...
end;Top
6 楼Tine2()回复于 2002-06-06 16:39:27 得分 0
你好,我是Tine.知道吗?Top
7 楼lxl(是我,不是风)回复于 2002-06-06 16:39:27 得分 55
试试这个:
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;Top
8 楼turbopeng(济元)回复于 2002-06-06 16:46:31 得分 0
呵呵,知道啊。我现在不能用QQ啊。:(Top
9 楼Tine2()回复于 2002-06-06 16:53:09 得分 0
我想请教你一个问题:DCOM服务器的CallBack的技术怎样实现?
就是在Client端定义一个interface,然后让Server端能调用。Top
10 楼kplchx(lcx)回复于 2002-06-06 17:07:00 得分 44
因为存放图片的内容还含有图片文件的路径和文件名称,因此读出时应数据流
应该处理,从其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;
Top
11 楼turbopeng(济元)回复于 2002-06-06 18:22:47 得分 0
再次感谢楼上的诸位!Top
12 楼turbopeng(济元)回复于 2002-06-06 18:27:55 得分 0
我这些时间一直都没有弄COM+,所以不会呀~~~:(Top




