jpg格式文件(急急急急急急!!!!)(50分)

  • 主题发起人 主题发起人 雨之子
  • 开始时间 开始时间

雨之子

Unregistered / Unconfirmed
GUEST, unregistred user!
如何将jpg格式的文件写进access数据库。给我原代码好吗。现在分太少不够的话以后还可以给。
 
用二进制
通过, 不过按理说用tmemorystream也是可以的, 不过image.picture没有loadfromsteam
方法, 而picture.graphic又不支持jpg, 只好作罢:-(
procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
begin
if tblobfield(table1.FieldByName('longbinary')).BlobSize>100 then
begin
tblobfield(table1.FieldByName('longbinary')).SaveTofile('c:/temp/aaa.jpg');
image1.Picture.LoadFromfile('c:/temp/aaa.jpg');
end
else
image1.Picture.Assign(nil);
end;

 
如何实现在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 MyJPEGdo
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。
 
两位我是说在ASP中如何写进数据库,而不是在DELPHI中。不知道是不是有办法。还请帮忙呀。
 
哦,ASP俺们不熟,不过俺又帮你找了个例子,你参考一下吧
问题:如何使用ASP给ACCESS数据库的OLE对象字段插入gif图象文件同时如何通过ASP把图象调出显示在网页上?
回答:
写入:
1:把gif图像文件读入内存(一个变量strTemp)。
2:写入数据库。
Dim binTmp() As Byte
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSql As String
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset
conn.Open "db"
strSql = "select * from tbImage"
rs.Open strSql, conn, 1, 3
OpenFile ("bayshore.jpg")
'请自己实现OpenFile函数
rs.AddNew
rs.Fields("image").AppendChunk binTmp
rs.Update
读出和显示:
show.asp:
<%
dim P
dim L
L = 8192
dim conn,rs,strSql
set conn=server.CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &amp;server.MapPath(".") &amp;
"/db2.mdb;Persist Security Info=False"
set rs=server.CreateObject("ADODB.Recordset")
strSql = "select * from tbImage"
Response.ContentType = "image/gif"
'Important!
rs.open strSql,conn,1,1
rs.movelast
do

P = rs("image").GetChunk(L)
Response.BinaryWrite P
IF LenB(P) < L then
exitdo

loop
%>
在html中:
<image src=show.asp>
 

一、JPG圖片保存到數據庫方法,我的方法是打開一個JPG圖片文件放在Image1圖片控件中,然后再把它讀進圖片字段中:
if OpenDialog1.Execute then
begin
image1.Picture.LoadFromFile(OpenDialog1.FileName );
TBlobField(ADOTable1.FieldByName('Employee_photo')).Assign(image1.Picture.Graphic);
end;



二、從數據庫字段中讀出圖片文件,Employee_photo為圖片字段
procedure TForm1.ADOTable1AfterScroll(DataSet: TDataSet);
var
mstream:tmemoryStream;
JpgFile:TjpegImage;
f:tfilestream;
Stream1:TStream;
BLS:TBlobStream;
begin
if not ADOTable1.FieldByName('Employee_photo').IsNull then
begin
;
mstream:=tmemoryStream.Create ;
JpgFile:=TjpegImage.Create ;
TBlobField(ADOTable1.FieldByName('Employee_photo')).SaveToStream(mstream);
mstream.Position :=0;
jpgfile.LoadFromStream(MStream);
image1.Picture.Assign(JpgFile);
end
else
begin
image1.Picture :=nil;
end;
end;


不過我的是SQL SERVER。
行不行?
 
剪贴板行不???????????
 
后退
顶部