75!75!75!我再给50分!一共给75分!!一定给!!!怎样在delphi去浏览和保存Access中插入的图象?急!急!急!急!! (25分)

  • 主题发起人 主题发起人 unclymouse
  • 开始时间 开始时间
U

unclymouse

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用delphi去浏览Access中插入的图象,但是一直出错。有没有办法解决?
(即在ACCESS数据库中存有图象,我现在想用DELPHI去浏览这些图片,并且我还可以
在DELPHI中将图片存入ACCESS数据库中。最好是ADO)
只要解决好就给50分!!!
大家看清楚条件!!!先谢谢了
[:(!]
 
我也想知道,up!
 

dbimage行吗?
 
去参考一下TDBImage的导入图象的那段代码,对你可能有点帮助。^_^
 
[red][/red][:(!]我都试了不行啊,还有其他办法没有啊??
 
[:(!]!!!!!!!!!!!!谁解决了我另外再给50分!!!!!!!!
[:(!]!!!!!!!!!!!!谁解决了我另外再给50分!!!!!!!!
[:(!]!!!!!!!!!!!!谁解决了我另外再给50分!!!!!!!!
[:(!]!!!!!!!!!!!!谁解决了我另外再给50分!!!!!!!!
[:(!]!!!!!!!!!!!!谁解决了我另外再给50分!!!!!!!!
我说到做到!!!!!!!!!!
 
用DBimage控件
然后再用Dialogs 下的OpenPictureDialog控件
OpenPictureDialog.Execute;
if OpenPictureDialog.FileName <> '' then
adoquery1.fieldbyname('picture').LoadFromFile(OpenPictureDialog.FileName);
一定可以搞定
 
你ACCESS里存的是什么图象,假如是Bmp用DBImage就可以了
假如是其它Delphi能显示的图象,就要写程序或去找组件,
我写了一个显示JPG的DBImage,你是否需要,留下E-MAIL
 
不好意思,上面的是如何将图片导入数据库中,
如果是浏览的话,只要用dbimage就可以了…!
 
显示BLOB字段的BMP图

(1)直接显示当前记录
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.Bitmap.Assign(Table1Bitmap);
//Table1Bitmap为在Table中添加的字段
end;

(2)直接显示
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.Bitmap.Assign(
TBLOBField(Table1.Fields[1]));
end;
//Image1.Picture.Bitmap.Assign(Table1.Fields[1]);也行

(3)不直接显示
procedure TForm1.Button2Click(Sender: TObject);
var
B: TBitmap;
begin
B := TBitmap.Create;
try
B.Assign(Table1Bitmap);
Image1.Picture.Bitmap.Assign(B);
finally
B.Free;
end;
end;

 
[:D]不好意思,各位大哥能否帮小弟说清楚点,我还是不太明白!!谢谢,我随时在线。
 
去我的网页上看看吧。
http://懒虫007.delphibbs.com
如果不行的话我把例子发给你。
 
懒虫007:
我眼睛都找花了还没找到,我急用啊?能不能给个例子或一段详细的代码?
谢谢!
 
原文如下:

如何实现在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--Bina
ry 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。

 
如果可能的话给我也发一份!
lysh@net99.com.cn
 
前些日子为答网友写的例子。其中button2为从数据库中显示JPEG格式的图片。
对于BMP格式的图片不用如此,上面有诉。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,jpeg, DB, ADODB, DBCtrls, Grids, DBGrids, StdCtrls,
ExtCtrls;

type
TForm1 = class(TForm)
Image1: TImage;{用来存放图片以备用}
Image2: TImage;{用来显示从数据库中提取出来的图片}
Button1: TButton;
Button2: TButton;
DBGrid1: TDBGrid;
ADOQuery1: TADOQuery;
DataSource2: TDataSource;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
Image1.picture.loadfromfile('d:/work/pic.bmp'); {须保证d:/下有名为pic.bmp文件}
MyJPEG:=TJPEGImage.Create;
Try
MyJPEG.Assign(Image1.Picture.Graphic); {图像转成JPEG格式,如为JPEG图片则不必加}
MS:=TMemoryStream.Create;
MyJPEG.SaveToStream(MS);
MS.Position:=0;
ADOQuery1.Append;
ADOQuery1.FieldByName('name').Value:='1';
TBlobField(ADOQuery1.FieldByName('pic')).LoadFromStream(MS);
ADOQuery1.Post;
messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
MS.Free;
Finally
MyJPEG.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
MS:=TMemoryStream.Create;
MyJPEG:=TJPEGImage.Create;
ADOQuery1.Requery;
try
TBlobField(ADOQuery1.FieldByName('pic')).SaveToStream(MS);
MS.Position:=0;
MyJPEG.LoadFromStream(MS);
Image2.Picture.Bitmap.Assign(MyJPEG);
finally
MS.Free;
MyJPEG.Free;
end;
end;


end.
 
懒虫007:
多谢啊!还有一个问题就是:图片保存已经实现了,但是图片打开还是不行,是不是后面一段程序
有问题啊? ADOQuery1.Requery; 这是什么意思啊?
我的QQ:39493690
请指点!
 
图片大了,通过Query来查询会有问题,有时图片看不全。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部