图片在数据库中的存储???(在线等)(50分)

  • 主题发起人 主题发起人 stephen_guan
  • 开始时间 开始时间
S

stephen_guan

Unregistered / Unconfirmed
GUEST, unregistred user!
刚才看了很多这方面的帖子,但是总是零零星星的。我自己也试了,但是总是不行。
1.从数据库中显示
var
pic : TMemoryStream;
begin
pic:=TMemoryStream.Create;
(TBlobField(frmModalType.ClientDataSet1.fieldbyName('imgModalImage'))).SaveToStream(pic);
Image1.Picture.Graphic.LoadFromStream(pic);
pic.Free ;
end;
但是总报错:[Error] whModalAdd.pas(98): Illegal character in input file: '¡¡' ($A1A1)

2.从界面放入数据库
数据库中有imgModalImage字段,属性为image。我要用sql语句添加和修改,应该怎么样写? 界面中为image控件
 
procedure TForm1.Button1Click(Sender: TObject);
var
fs:TFileStream;
MS: TMemoryStream;
Bmp:TBitmap;
MYJpeg:TJPEGImage;
begin
if OpenPictureDialog1.Execute then
begin
if ExtractFileExt(OpenPictureDialog1.FileName) = '.bmp' then
begin
Bmp:=TBitmap.create;
MYJpeg:= TJpegImage.Create;
MS:=TMemoryStream.create;
try
Bmp.LoadFromFile(OpenPictureDialog1.FileName);
with MYJpeg do
begin
Assign(Bmp);
MS.Position:=0;
SaveToStream(MS);
Table1.Edit;
TBlobField(Table1.FieldByName('ZGZP')).LoadFromStream(MS);
Table1.Post;
end;
finally
Bmp.Free;
MYJpeg.Free;
MS.Free;
end;
end
else
begin
fs:=TFileStream.Create(OpenPictureDialog1.FileName,fmOpenRead);
Try
Table1.Edit;
TBlobField(Table1.FieldByName('ZGZP')).LoadFromStream(fs);
Table1.Post;
Finally
fs.free;
end;
end;
end;


详细请看我的笔记:
http://www.delphibbs.com/keylife/iblog_show.asp?xid=2931
 
你用的是什么数据库?看看这个能不能帮你:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2234684
 
谢谢,写的很详细,但是有一个问题
TJPEGImage 总是不能找到,还应该写什么吗
 
用DBImage控件正确显示该图片
下面是例子程序中的代码:
功能包括:
从文件中加载,
判断当前图像格式,
进行放大预览,
保存到文件

procedure TMainFrm.Button3Click(Sender: TObject);
var
fn: String;
pic: TPicture;
begin
pic := nil;
try
if OpenPictureDialog1.Execute then
begin
fn := OpenPictureDialog1.FileName;
pic := TPicture.Create;
pic.LoadFromFile(fn);
ADOQuery1.Edit;
ADOQuery1.FieldByName('data').Assign(pic.Graphic);
end;
finally
if Assigned(pic) then FreeAndNil(pic);
end;
end;
 
前面要
uses jpeg
 
很简单,显示用TDBImage组件,至于保存嘛,用TTable1['FiledName'].Assign(Image1.Picture)即可!
 
implementation
uses whMain, whModalType, whItemPlan, whBjPlanMake, whBjPlanExec, jpeg;
~~~~~~~~~~~
这样吗,还是不行啊,以前没有用过这个,还请棒棒忙
 
保存和显示,现在我都明白了原理,但是TJpegImage总是报错啊,棒棒忙,急
 
显示数据库中的图像,可以同时兼容各种格式
ftp://new:new12345@61.129.70.192:2100/datanew/imgtest.rar
 
你前面到底有没
uses jpeg 呢?

 
http://www.playicq.com/dispdocnew.php?id=4722
 
uses jpeg; 即可
 
(TBlobField(frmModalType.ClientDataSet1.fieldbyName('imgModalImage'))).SaveToFile('c:/tmp.bmp');
Image1.Picture.LoadFromFile('c:/tmp.bmp');
 
给分吧,以下方法我试过了,没有问题

如何实现在MS Access数据库中图像的存储和显示
一、 原理介绍——流式数据的类型及其应用
在Dephi中提供了TStream来支持对流式数据的操作。TStream是万流之源,但由于它是一个抽象类,故不能被直接使用;而要使用其相应的子类,
如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、TWinSocketStream和TOleStream。TStream提供了统一、简洁的方法来进行数据的读写。
1.)SaveToStream(Stream: TStream ); 作用:将类中的数据写到Stream的当前位置中
2.)LoadFromStream(Stream: TStream); 作用:从当前位置读入Stream里的数据
实际使用时我们基本上只要使用上面两个函数就可以了。
二、所遇到的问题及相应的解决方法
为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。
(一)所遇到的问题
第一、在Delphi 5中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,
这样就产生了图像格式转化的需求;而TImage本身并不直接提供这两种图像格式之间的转化。
第二、怎样将存储在Microsoft Access数据库中的图像取出并且显示出来:在Delphi 5中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:
它所能显示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在该组件中的显示;
但根据实际需要,在Microsoft Access数据库中所存储的图像数据却是以JPEG格式保存的。
(二)相应的解决方法
为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB——Binary Large Object),它是用来处理某些特殊格式的数据的。BLOB在数据库的表中
实际上是以二进制数据的形式存放的。
为了处理BLOB字段,可以借鉴一些可视的桌面数据库的方法。在这里,我们选择了通过内存流的方式来完成;使用内存流,可减少磁盘操作,大大提高运行效率。
具体的过程和相关的程序代码如下:
1、如何实现在Microsoft Access数据库中的图像存储:
这里是利用TStream的子类TMemoryStream向Microsoft Access数据库中存储图像的。下面的这段代码是在按了“保存”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
MyJPEG := TJPEGImage.Create;
try
with MyJPEG do
begin
Assign(Image.Picture.Graphic);
MS:=TMemoryStream.create;
SaveToStream(MS);
MS.Position:=0;
Table1.Edit;
TBlobField(Table1.FieldbyName('Image')).LoadFromStream(MS);
Table1.Post;
messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
end;
finally
MyJPEG.Free;
end;
end;
在这段代码里TStream的子类TMemoryStream利用内存流起到了将BMP格式转化为JPEG格式的中间桥梁的作用。
2、如何将图像从Microsoft Access数据库中取出并显示出来:
下面的这段代码是在按了“查看图像”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var tempstream:TStringStream;
tempjpeg:TJPEGImage;
begin
try
tempstream:=TStringStream.Create(' ');
TBlobField(Query1.FieldByName('Image')).SaveToStream(tempstream);
tempstream.Position:=0;
tempjpeg:=TJPEGImage.Create;
tempjpeg.LoadFromStream(tempstream);
DBImage1.Picture.Bitmap.Assign(tempjpeg);
finally
tempstream.Free;
tempjpeg.Free;
end;
end;
这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TStringStream中去,然后设置数据指针
在TStringStream中的位置为0;接着从TStringStream中读入相关数据,
并把它们赋给TDBImage.Picture.Bitmap,
这样一来就实现了将数据库中所存储的JPEG格式的数据转化为BMP格式,并在TDBImage中将图像显示出来。最后
将TStringStream和TJPEGImage这两个对象释放掉。特别要注意的是不能
在设计阶段设置TDBImage的DataField属性,
而只能通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给TDBImage.Picture.Bitmap。

 
真好,想想听听
 
TO stephen_guan,
uses jpeg错了,不应该在这里,在最前面那里uses jpeg;
 
后退
顶部