Delphi存取SQL SERVER2000中JPEG图像和BMP图像

合集下载

DELPHI SQL 存取图像

DELPHI SQL 存取图像

Delphi sql存取图像procedure TForm1.Button1Click(Sender:TObject);//插入图片过程varStream:TMemoryStream;begintryStream:=TMemoryStream.Create;//创建内存流Image1.Picture.Graphic.SaveToStream(Stream);//将图片保存到内存流中adoquery1.Close;adoquery1.SQL.Clear;adoQuery1.SQL.Add('Insert into tbltemp(Image)values(:photo)');//进行插入操作adoQuery1.Parameters.ParamByName('photo').LoadFromStream(Strea m,ftBlob);//读取保存的内存图adoquery1.ExecSQL;finallyStream.Free;//释放内存流end;end;procedure TForm1.Button2Click(Sender:TObject);//读取图片过程varStream:TMemoryStream;Jpg:TjpegImage;beginADOQuery1.Close;ADOQuery1.SQL.Text:='SELECT*FROM tbltemp';//查询图片ADOQuery1.Open;if not ADOQuery1.FieldByName('Image').IsNull thenbeginStream:=TMemoryStream.Create;Jpg:=TjpegImage.Create;TBlobField(ADOQuery1.FieldByName('Image')).SaveToStream(Stream) ;//显示的转换为BlobField并保存到内存流Stream.Position:=0;jpg.LoadFromStream(Stream);//加载图片image2.Picture.Assign(Jpg);endelsebeginimage2.Picture:=nil;end;end;sql server2005字段类型为imagedelphi使用的单元为jpeg,db,dbtables;delphi存储图片代码片段procedure TForm1.btnPostClick(Sender:TObject);varlMemoStream:TMemoryStream;jpg:TJpegImage;beginlMemoStream:=TMemoryStream.Create;jpg:=TJpegimage.Create;jpg.Assign(Img.Picture.Graphic);jpg.SaveToStream(lMemoStream);lMemoStream.Position:=0;TBlobField(dm1.adoqrytea.fieldbyname('image')).LoadFromStream(lMemoStream);dm1.adoqrytea.Post;end;delphi从数据库读取到image中的代码片段procedure TForm3.FormShow(Sender:TObject);varMyJPEG:TJPEGImage;MS:TMemoryStream;beginMyJPEG:=TJPEGImage.Create;MS:=TMemoryStream.Create;if not dm1.adostuview.Active thendm1.adostuview.Open;with dm1.adostuview dobeginTBlobField(dm1.adostuview.Fields[9]).SaveToStream(MS);ms.Position:=0;MyJPEG.LoadFromStream(MS);Img.picture.assign(MyJPEG);MyJPEg.free;MS.free;end;end;uses,jpeg,dbshowprocedure Tfrmyd.SpeedButton4Click(Sender:TObject);constJPEG_FLAG_BEGIN=$D8FF;JPEG_FLAG_END=$D9FF;varStream:TMemoryStream;Flag1,Flag2:word;Jpg:TjpegImage;begindmdata.ADOQupdate.Close;dmdata.ADOQupdate.SQL.Text:='SELECT*FROM Restaurant where reno=''5''';//查询图片dmdata.ADOQupdate.Open;if not dmdata.ADOQupdate.FieldByName('photo').IsNull thenbeginStream:=TMemoryStream.Create;TBlobField(dmdata.ADOQupdate.FieldByName('photo')).SaveToStream(Stream);//显示的转换为BlobField并保存到内存流Stream.Position:=0;Stream.Read(Flag1,SizeOf(Flag1));Stream.Position:=Stream.Size-2;Stream.Read(Flag2,sizeOf(Flag2));if(flag1=JPEG_FLAG_BEGIN)and(flag2=JPEG_FLAG_END)thenbeginStream.Position:=0;Jpg:=TjpegImage.Create;jpg.LoadFromStream(Stream);//加载jpeg图片image1.Picture.Assign(Jpg);jpg.Free;endelsebeginStream.Position:=0;//加载bmp图片image1.Picture.BITMAP.LoadFromStream(Stream);end;endelsebeginimage1.Picture:=nil;end;end;shaveprocedure Tfrmyd.SpeedButton2Click(Sender:TObject);varStream:TMemoryStream;beginif OpenDialog1.Execute thenbeginimage1.Picture.LoadFromFile(OpenDialog1.FileName);tryStream:=TMemoryStream.Create;//创建内存流Image1.Picture.Graphic.SaveToStream(Stream);//将图片保存到内存流中dmdata.ADOQupdate.Close;dmdata.ADOQupdate.SQL.Clear;dmdata.ADOQupdate.SQL.Add('Insert into Restaurant(photo)values(:photo)'); //进行插入操作dmdata.ADOQupdate.Parameters.ParamByName('photo').LoadFromStream(Stream,ft Blob);//读取保存的内存图dmdata.ADOQupdate.ExecSQL;finallyStream.Free;//释放内存流end;end;end;内存流中转换jpeg传入imagelist中usesJpegmyjpg:=TJPEGImage.Create;mybmp:=TBitmap.Create;tmpbmp:=TBitmap.Create;myjpg.LoadFromFile(JPEG文件);mybmp.Assign(myjpg);tmpbmp.Width:=136;tmpbmp.Height:=160;tmpbmp.Canvas.StretchDraw(tmpbmp.Canvas.ClipRect,mybmp);ImageList.Add(tmpbmp,nil);。

Delphi存取图像完整解决方案Delphi教程.

Delphi存取图像完整解决方案Delphi教程.

Delphi存取图像完整解决方案Delphi教程对于涉及图像数据的数据库应用程序,图像数据的存取技术是一个关键。

由于缺少技术文档及DEMO例程演示,为此笔者在网上搜索了相关资料,有的根本不能用,有的过于繁杂,有的应用范围太窄(如只能适用于BMP 图像),有的写得过于简单理解起来十分困难。

而且在网上这也是大家比较关心的一个问题。

笔者对这个问题进行了反复实作和探索,下边笔者将通过一个完整的简单例子来说明如何保存和显示SQL数据库中的图像数据(同时包括BMP和JPEG两种格式)。

一、创建演示数据库在SQL SERVER中新建一演示数据库:Demo,并创建一数据表Picture1,结构如下:字段名Dtata TypeIdentityId Int YesIsbmpTinyint MyimageImage 字段Isbmp是用来记录在Myimage中存入的图像的类型(0表JPEG,1表BMP,其它值表无图像),Isbmp数据类型选用整型Tinyint而末选用逻辑bit型主要是考虑到如下方法仍适用于ACCESS数据库。

在SQL中打开表Picture1,添入几条记录,Myimage图像字段值暂不管,字段Isbmp值随便输入0和1之外的其它数。

二、窗口设计在DELPHI中新建一个工程,在FORM1上放置如表所示控件(考虑到TDBImage型控件不能正确显示JPEG型图像,所以选用Timage型控件显示所有类型图像)。

组件类别组件属性名属性值用途说明TimagecaptionImage1显示图像nameImage1StretchTrue Tbuttoncaption选择图像选择图像nameselectimageTbuttoncaption保存图像保存图像到数据库namesavetodb TADOConnectioncaption Adoconnection1创建与数据库demo的连接nameAdoconnection1 Connectionstring见备注ConnectedTrueLoginpromptFalse TadotableCaptionAdotable1建立与表Picture1的连接nameAdotable1 ConnectionAdoconnection1TablenamePicture1Active TrueTdatasourceNameDatasource1建立数据源DatasetAdotable1TopenpicturedialogCaptionOpenpicturedialog1选择图像文件NameOpenpicturedialog1TdbgridCaption Dbgrid1显示记录NameDbgrid1DatasourceDatasource1 备注:adoconnection1.connectstring := Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=demo;DataSource=MysqlserverMysqlserver为SQL服务器的名称请据实际情况更改。

delphi中处理sqlserver中的image、text字段

delphi中处理sqlserver中的image、text字段

delphi中处理sqlserver中的image、text字段下面通过详细的例子来讲述如何在delphi中处理sql server中的image、text字段。

因为实际开发的需要,我们需要处理的是text类型的字段,包括读和写。

网上很多相关的文章都是讲述的对image的读写操作,下面首先介绍如何将图象存储在sql server的image字段。

其中DataMConn为一个针对数据库操作的单元,放置一个ADOConnection,一个ADOQuery //image to database procedure TfrmText.Button1Click(Sender: TObject);varbm:tbitmap;ms:TMemoryStream;beginms:=TMemoryStream.Create;bm:=TBitmap.Create;bm.Assign(image1.Picture.Bitmap);bm.SaveToStream(ms);with DataMConn.ADOQHistory dobeginClose;SQL.Clear;SQL.Add('INSERT INTO Package(PackageID,TempPackage) VALUES(:x,:y)');Parameters.ParamByName('y').LoadFromStream(ms,ftBlob);Parameters.ParamByName('x').Value := 'aaaaa';ExecSQL;end;end;//show imageprocedure TfrmText.Button2Click(Sender: TObject);varStream:TStream;bm:tbitmap;beginwith DataMConn.ADOQHistory dobeginClose;SQL.Clear;SQL.Add('SELECT * FROM Package WHERE packageID= ''aaaaa''');TryOpen;stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('T em pPackage'),bmRead);bm:=TBitmap.Create;bm.LoadFromStream(stream);image2.Picture.bitmap.Assign(bm);stream.Free;exceptbeginShowMessage('Error!');Exit;end;end;//tryend;end;下面的两个例子是如何处理text类型的字段,其中读取的时候,利用了一个TDBMemo控件,来加载读取的流数据,然后赋值给一个WideString类型的变量str//text to streamprocedure TfrmText.Button3Click(Sender: TObject);varstr : WideString;ss:TStringStream;i : integer;beginstr := 'sstrstrststrstrststrstrstrsttrstrstrrstrstr';for i := 1 to 10000 dobeginstr := str + 'sstrstrststrstrststrstrstrsttrstrstrrstrstr'; //43万多个字节end;str := str + 'E';ss := TStringStream.Create(str);//bm:=TBitmap.Create;//bm.Assign(image1.Picture.Bitmap);//bm.SaveToStream(ms);with DataMConn.ADOQHistory dobeginClose;SQL.Clear;SQL.Add('INSERT INTO tPackage(PackageID,TempPackage) VALUES(:x,:y)');Parameters.ParamByName('y').LoadFromStream(ss,ftMemo);Parameters.ParamByName('x').Value := 'aaaaa';ExecSQL;end;end;//read text to a TDBMemoprocedure TfrmText.Button4Click(Sender: TObject);varstream : TStream;str : WideString;beginwith DataMConn.ADOQHistory dobeginClose;SQL.Clear;SQL.Add('SELECT TempPackage FROM tPackage WHERE packageID= ''aaaaa''');Open;if not IsEmpty thenbeginStream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('T em pPackage'),bmRead);stream.Position := 0;AMemo.Lines.LoadFromStream(stream);stream.Free;end;end;end;//下面是把text字段的数据内容直接读到一个WideString中,而不通过TDBMemo,因为在实际中,不知道何种原因,线程读到数据后,只能在第一次处理时正常,然后再用鼠标点应用程序,程序就停了……who knows the reason , pls tell me & 3ksprocedure TfrmText.Button5Click(Sender: TObject);varBuffer: PChar;MemSize: Integer;Stream: TStream;str : WideString;beginwith DataMConn.ADOQHistory dobeginClose;SQL.Clear;SQL.Add('SELECT TempPackage FROM tPackage WHERE packageID= ''aaaaa''');Open;if not IsEmpty thenbeginStream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('T em pPackage'),bmRead);tryMemSize := Stream.Size;Inc(MemSize); //Make room for the buffer's null terminator.Buffer := AllocMem(MemSize); //Allocate the memory.tryStream.Read(Buffer^, MemSize); //Read TempPackage field into buffer.str := Buffer;finallyFreeMem(Buffer, MemSize);end;finallyStream.Free;end;end;end;end;如何用流的方法向SQLServer数据库中读写blob的image字段varTempStream: TMemoryStream;begin//ReadTempStream := TMemoryStream.Create;tryTBlobField(FieldByName('ImageField')).SaveToStream; TempStream.Position := 0;Memo1.Lines.LoadFromStream(TempStream);FinallyTempStream.Free;end;//WriteTempStream := TMemoryStream.Create;tryMemo1.Lines.SaveToStream(TempStream);//Image1.Picture.Bitmap.LoadFromStream(TempStream); TBlobField(FieldByName('ImageField')).LoadFromStream; FinallyTempStream.Free;end;end;varaStream1 : TStream;jpg : tjpegimage; //在uses 加入 jpeg,db 单元插入jpg := tjpegimage.Create();trydm.Query_image.open;dm.query_image.insert;aStream1 := dm.query_image.CreateBlobStream(dm.query_image.FieldByNa me('content'),bmReadWrite);jpg.LoadFromFile(name);jpg.SaveToStream(aStream1);aStream1.Free;dm.query_image.Post;finallyjpg.Free;end;取出if dm.query_image.State <> dsBrowse then exit;if dm.query_image.FieldByName('content').IsNull then Exit; //判断状态,content是我表里存放jpeg的fielddm.query_image.open;aStream1 := dm.query_image.CreateBlobStream(dm.query_image.FieldByNa me('content'), bmRead);tryaStream1.Position := 0;jpg:= tjpegimage.Create();tryjpg.LoadFromStream(aStream1);jpg.SaveToFile(ipath); //ipath:string 存放路径与文件名finallyjpg.Free;end;finallyaStream1.Free;end;end;文件写入字段:SQLstr:='INSERT INTO 表名(...,Image字段名,...)VALUES (...,:Image,...)';Query.SQL.Add(SQLstr);Query.SQL.ParamByName('Image').LoadFromFile(图象文件名);Query.ExecSQL;从字段写入文件:SQLstr:='SELECT ...,Image字段名,... FROM 表名 WHERE...';Query.Close;Query.SQL.Clear;Query.SQL.Add(SQLstr);Query.Open;(Query.FieldByName(Image字段名) as TBlobField).SaveToFile(文件名);//或TBlobField(Query.FieldByName(Image字段名)).SaveToFile(文件名);向SQL Server插入带有Image字段的记录向SQL Server插入记录相信大家都会做,但是如果表中带有Image字段就不好弄了,这里有一个例子,非常安全,同时也向大家展示动态生成控件的技巧!在SQL Server中建立TEST表,两个字段,id varchar(10),photo image(16);procedure TForm1.BitBtn1Click(Sender: TObject);beginopenpicturedialog1.execute;image1.picture.loadfromfile(openpicturedialog1.filename);end;procedure TForm1.BitBtn2Click(Sender: TObject);vargraphic1:Timage;begingraphic1:=Timage.Create(self);graphic1.picture.loadfromfile(openpicturedialog1.filename);table1.Open;table1.insert;table1.fieldbyname(’id’).asstring:=’121’;table1.fields[1].assign(graphic1.Picture);table1.post;table1.close;graphic1.free;end;显示可用:DBIMAGE控件显示!DELPHI存取JPEG文件到SQL Server数据库unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ExtCtrls, DBCtrls, Grids, DBGrids, Db, ADODB,jpeg, StdCtrls,dbtables;{一定要USES JPEG单元,使能存储JPG文件格式}typeTForm1 = class(TForm)DataSource1: TDataSource;ADOQuery1: TADOQuery;DBGrid1: TDBGrid;DBNavigator1: TDBNavigator;Image1: TImage;savebutton: TButton;showbutton: TButton;OpenDialog1: TOpenDialog;ADOQuery1id: TIntegerField;ADOQuery1pic: TBlobField;procedure savebuttonClick(Sender: TObject);procedure showbuttonClick(Sender: TObject);procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}function JpegStartsInBlob(PicField:TBlobField):integer;varghy: TADOBlobstream;buffer:Word;hx: string;beginResult := -1;ghy := TADOBlobstream.Create(PicField, bmRead);trywhile (Result = -1) and (ghy.Position + 1 < ghy.Size) dobeginghy.ReadBuffer(buffer, 1);hx:=IntToHex(buffer, 2);if hx = ’FF’ then b eginghy.ReadBuffer(buffer, 1);hx:=IntToHex(buffer, 2);if hx = ’D8’ then Result := ghy.Position - 2else if hx = ’FF’ thenghy.Position := ghy.Position-1;end; //ifend; //whilefinallyghy.Freeend; //tryend;procedure TForm1.savebuttonClick(Sender: TObject);varpicstream:tadoblobstream;beginadoquery1.edit;picstream:=tadoblobstream.Create(tblobfield(adoquery1.fie lds[1]),bmWrite);if form1.opendialog1.execute thenbeginpicstream.LoadFromFile(opendialog1.filename);picstream.Position:=0;adoquery1.edit;tblobfield(adoquery1.Fields[1]).loadfromstream(picstream);adoquery1.post;end;end;procedure TForm1.showbuttonClick(Sender: TObject);varghy:TADOBlobstream;pic:tjpegimage;beginghy := TADOBlobstream.Create(Adoquery1pic, bmRead);tryghy.Seek(JpegStartsInBlob(Adoquery1pic),soFromBeginning );Pic:=TJpegImage.Create;tryPic.LoadFromStream(ghy);Image1.Picture.Graphic:=Pic;finallyPic.Free;end;finallyghy.Freeend;end;procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);beginif button in [nbFirst, nbPrior, nbNext, nbLast] thenshowbutton.Click;end;end.如果数据库中要存储的是BMP文件,则在procedure TForm1.showbuttonClick(Sender: TObject);过程中代码更改如下即可存储显示BMP文件格式的操作。

delphi实现bmp与jpg图像相互转换及位图大小调整

delphi实现bmp与jpg图像相互转换及位图大小调整

delphi实现bmp与jpg图像相互转换及位图大小调整摘要:本文介绍了如何通过delphi编码实现bmp格式图像与jpeg格式图像的相互转换以及bmp格式图像的大小的调整。

在图片处理操作中使用了几个api函数,其算法同样适用于其他编程语言。

关键词:图形转换、图片调整在很多MIS系统或者其他管理信息系统中,有需要用户上传照片到数据库等对图片的操作,根据系统需求不同,可能需要对这些照片进行格式转换或者大小的调整。

这里有三个在MIS系统或者其他管理信息系统中比较常用的图片处理过程,与大家分享。

1、Bmp格式转换位jpg(jpeg)格式。

进程:Image_BitmapToJPeg实现bmp格式图片到Jpg(jpeg)格式图片的转换,如下:{参数介绍:FileName:要转换的位图的路径及名称SaveFileName:转换后生成jpg图形的路径及名称}Procedure Image_BitmapToJPeg(Const FileName: String;SaveFileName:String='');V arBitmap: TBitmap; //定义变量JPeg: TJPegImage; //所属unit是:Jpeg,需要在项目的uses 中加入Jpeg BeginTryBitmap := TBitmap.Create; //创建位图资源Bitmap.LoadFromFile(FileName); //根据传入的参数载入位图资源JPeg := TJPegImage.Create; //创建jpeg资源JPeg.Assign(Bitmap); //把bitmap中的图像资源拷贝到jpeg对象中IF Trim(SaveFileName)='' Then //如果传入的目的地址为空,按原名保存(扩展名改变)JPeg.SaveToFile(ChangeFileExt(FileName, '.jpg'))Else //按参数指定的名称保存jpg图片JPeg.SaveToFile(SaveFileName);FinallyFreeAndNil(Bitmap); //释放资源FreeAndNil(JPeg); //释放资源End;End;从上面的代码及其注释中我们可以看出程序思路,首先分别定义并创建bmp 对象Bitmap和jpeg对象JPeg,然后在Bitmap对象载入位图后,把Bitmap中的图像资源复制到Jpeg中,最后把Jpeg保存到磁盘并释放创建的对象。

DELPHI 中怎样打开JPG图片 保存到数据库中并要打印

DELPHI 中怎样打开JPG图片 保存到数据库中并要打印

end; finally Picture1.Free; bmp1.Free; end; except showmessage('图象保存失败!'); end;
if end;
biao=1 then DeleteFile(key);
打印则 qreport 中的 qrimage,或者是 fastrepot exports 中的 frBMPExport 和 frJPEGExport!!
key:=temp; key:=key+'.bmp'; bmp.savetofile(key);//转化结束,因为 mysql 不能存 jpg biao:=1; end else if bb then begin bmp.LoadFromFile(openpicturedialog1.FileName); key:=extractfilename(edit1.Text); biao:=0; end; image1.Picture.LoadFromFile(openpicturedialog1.FileName); bmp.free; end; 保存图片: var Picture1:TPicture; begin // 保存图片到数据库中 Picture1:=TPicture.create; try try if fileexists(edit1.text) then with ADOtable1 do begin adotable1.Close; adotable1.Open; Picture1.LoadFromFile(key); if Locate('name',extractfilename(edit1.text),[loCaseInsensitive])=false then begin indexfieldnames:='name'; ADOtable1.Insert; Fields[0].AsString:=extractfilename(key); Fields[1].Assign(Picture1); Post; showmessage('图象保存成功!'); end else showmessage('图象已经存在!');

在Delphi中轻松控制SQL的Image字段的数据存取

在Delphi中轻松控制SQL的Image字段的数据存取

本例程序所 能执行 的功能 ,主要包括 :为 某一学生加入相片,或为 S dn 表 的所有学生 t et u
或清除该学生相片等。 该方法简单且容易理解 ) ,而且在考生登录考试 加入相片 , 下面简要介绍控制 I A E字段存储数据 的 M G 系 统时 服务 器 能 自动 加 入 考 生 相 片 ( 生 相 片 考 e h 环境 中,按 以下 步骤设置表单 p 存放于服务器的文件夹下 ) ,及 时显示该照片。 方法。在 D l i 但为了简化问题 ,本 文仅介绍如何控制 I A E M G 及完成代码编写 :
料 的欠缺及 不完善 ,许 多用户及程序 员对如何控 制 IA E字 来存储数据 ,尚未掌握 和 了解,在 编写 实 M G 段
际程序 时 ,常受此 困扰 。本文针对这一问题 ,介 绍在 D p i eh 7轻松控制 S LSr r I A E Q Q e e 的 M G S L字段 ,来 v
相 片
p v t i r ae .
pic rP t:s n ; / si ue a ’t h t g / 照片文 件存 放位置 i r
{Pia elrt n r t d c a os} ve a i
poe ueT o . o Cet ( edr T bet ; rcd r F r F r rae S ne : O jc) m2 m
维普资讯
堡 壅 。 . .
在 D lh 中轻松控制 S L的 Iae字段 的数据存取 e i p Q mg
陈建兵 邹 月
( 广东省农业管理干部学院计算机 系,广东 广州 504 ) 160
[ 摘
要 ] 随着网络的普及 和发展 ,网络数据库 S LSr r 来越受到数据管理人 员的喜爱。 由于资 Q e e越 v

用VB存取SQLServer2000数据库中图片文件的方法

用VB存取SQLServer2000数据库中图片文件的方法

科技信息1.引言在数据库应用系统开发中,经常要对大容量的图片进行存取,如在档案管理系统中存取人员的照片。

而S Q L S e r v e r2000不支持INS ER T和U PD A T E语句对im a g e数据类型字段进行编辑,因此需编写专门过程来处理图像字段。

笔者结合自己的实际应用,给出了实现此功能的方法,愿与同仁共享。

2.S Q L S e r ve r2000中图像数据的存储机制在S Q L S e r v e r2000数据库中,对于小于8000个字节的图像数据可以采用二进制型(B i n a r y、V a r b i n a r y)来表示,但通常要保存的图片一般都大于8000个字节。

S Q L S e r v e r提供了一种机制,能存储每行大到2G的二进制对象(B L O B),这类对象可包括im a g e、t e x t和n t e x t三种数据类型,其中im a g e数据类型存储的是二进制数据。

V B6.0存取S Q L S e r v e r中B L O B数据有两种方法。

一是利用A D O F i e l d对象的A pp en d C h u n k和G e t C h u n k方法。

二是利用S t r e a m对象的L o a d F r om F il e和S a v e T o F il e方法。

为了更好说明这两种方法,本示例程序存储图片采用A D O F i e l d 对象的A pp en d C h u n k方法,而读取图片采用S t r e a m对象的S a v e T o F il e方法。

3.示例实现步骤及代码①在S Q L S e r v e r2000中创建数据库D A G L。

在D A G L中创建表S t u d en t,包括s t u_n o(c h a r型,存放学号)、s t u_n a m e(c h a r 型,存放姓名)、s t u_p h o t o(im a g e型,存放照片)三个字段。

Delphi获取JPG、GIF、PNG等格式图片的大小(高度和宽度)

Delphi获取JPG、GIF、PNG等格式图片的大小(高度和宽度)

Delphi获取JPG、GIF、PNG等格式图片的大小(高度和宽度)unit ImgSize;interfaceuses Classes;procedure GetJPGSize(const sFile: string; var wWidth, wHeight: Word);procedure GetPNGSize(const sFile: string; var wWidth, wHeight: Word);procedure GetGIFSize(const sGIFFile: string; var wWidth, wHeight: Word);implementationuses SysUtils;function ReadMWord(f: TFileStream): Word;typeTMotorolaWord = recordcase Byte of0: (Value: Word);1: (Byte1, Byte2: Byte);end;varMW: TMotorolaWord;begin{ It would probably be better to just read these two bytes in normally }{ and then do a small ASM routine to swap them. But we aren't talking }{ about reading entire files, so I doubt the performance gain would be }{ worth the trouble. }f.read(MW.Byte2, SizeOf(Byte));f.read(MW.Byte1, SizeOf(Byte));Result := MW.Value;end;procedure GetJPGSize(const sFile: string; var wWidth, wHeight: Word);constValidSig: array[0..1] of Byte = ($FF, $D8);Parameterless = [$01, $D0, $D1, $D2, $D3, $D4, $D5, $D6, $D7];varSig: array[0..1] of byte;f: TFileStream;x: integer;Seg: byte;Dummy: array[0..15] of byte;Len: word;ReadLen: LongInt;beginFillChar(Sig, SizeOf(Sig), #0);f := TFileStream.Create(sFile, fmOpenRead);tryReadLen := f.read(Sig[0], SizeOf(Sig));for x := Low(Sig) to High(Sig) doif Sig[x] <> ValidSig[x] then ReadLen := 0;if ReadLen > 0 thenbeginReadLen := f.read(Seg, 1);while (Seg = $FF) and (ReadLen > 0) dobeginReadLen := f.read(Seg, 1);if Seg <> $FF thenbeginif (Seg = $C0) or (Seg = $C1) thenbeginReadLen := f.read(Dummy[0], 3); { don't need these bytes } wHeight := ReadMWord(f);wWidth := ReadMWord(f);endelsebeginif not (Seg in Parameterless) thenbeginLen := ReadMWord(f);f.Seek(Len - 2, 1);f.read(Seg, 1);endelseSeg := $FF; { Fake it to keep looping. }end;end;end;finallyf.Free;end;end;procedure GetPNGSize(const sFile: string; var wWidth, wHeight: Word);typeTPNGSig = array[0..7] of Byte;constValidSig: TPNGSig = (137,80,78,71,13,10,26,10);varSig: TPNGSig;f: tFileStream;x: integer;beginFillChar(Sig, SizeOf(Sig), #0);f := TFileStream.Create(sFile, fmOpenRead);tryf.read(Sig[0], SizeOf(Sig));for x := Low(Sig) to High(Sig) doif Sig[x] <> ValidSig[x] then Exit;f.Seek(18, 0);wWidth := ReadMWord(f);f.Seek(22, 0);wHeight := ReadMWord(f);finallyend;end;procedure GetGIFSize(const sGIFFile: string; var wWidth, wHeight: Word);typeTGIFHeader = recordSig: array[0..5] of char;ScreenWidth, ScreenHeight: Word;Flags, Background, Aspect: Byte;end;TGIFImageBlock = recordLeft, Top, Width, Height: Word;Flags: Byte;end;varf: file;Header: TGifHeader;ImageBlock: TGifImageBlock;nResult: integer;x: integer;c: char;DimensionsFound: boolean;beginwWidth := 0;wHeight := 0;if sGifFile = '' then{$I-}FileMode := 0; { read-only }AssignFile(f, sGifFile);reset(f, 1);if IOResult <> 0 then{ Could not open file }Exit;{ Read header and ensure valid file. }BlockRead(f, Header, SizeOf(TGifHeader), nResult);if (nResult <> SizeOf(TGifHeader)) or (IOResult <> 0) or (StrLComp('GIF', Header.Sig, 3) <> 0) thenbegin{ Image file invalid }Close(f);Exit;end;{ Skip color map, if there is one }if (Header.Flags and $80) > 0 thenbeginx := 3 * (1 shl ((Header.Flags and 7) + 1));Seek(f, x);if IOResult <> 0 thenbegin{ Color map thrashed }Close(f);Exit;end;DimensionsFound := False;FillChar(ImageBlock, SizeOf(TGIFImageBlock), #0);{ Step through blocks. }BlockRead(f, c, 1, nResult);while (not EOF(f)) and (not DimensionsFound) dobegincase c of',': { Found image }beginBlockRead(f, ImageBlock, SizeOf(TGIFImageBlock), nResult); if nResult <> SizeOf(TGIFImageBlock) thenbegin{ Invalid image block encountered }Close(f);Exit;end;wWidth := ImageBlock.Width;wHeight := ImageBlock.Height;DimensionsFound := True;end;'Y': { Skip }begin{ NOP }end;{ nothing else. just ignore }end;BlockRead(f, c, 1, nResult);Close(f);{$I+}end;end.//调用方法procedure TForm1.Button1Click(Sender: TObject); varW, H: Word;sFileName:string;beginsFileName:='C:\test\test.jpg';GetJPEGSize(sFileName, W, H;showmessage(Format('Yes,W:%d,H:%d', [W, H])); end;end;//该代码片段来自于: /codes/delphi/8990。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Delphi存取SQL SERVER2000中存取图片
解决数据库中图片的问题,关键技术如下:
在数据库上使用Image二进制字段保存,使用Stream流的方式。

创建文件流:
Word_FileStream:=TFileStream.Create(Target_Name,fmOpenWrite or fmCreate);
Word_FileStream.Position:=0;
保存到数据库的Image字段:
TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream); 从数据库读取文件到本地硬盘:
TBlobField(ADOQuery1.FieldByName(Column_Name)).loadfromStream(Word_FileStream);
释放文件流:
Word_FileStream.Free;
Server中该字段的数据类型是Image,在Access中该字段的数据类型是OLE对象。

...
既然你已经用TDBImage控件使用Picture.LoadFromFile装入了图片,只要该图片字段和TDBimage控件相连了,直接用adodataset.post,就保存到了数据库。

如果没有相连,可以直接用Tblobfield(adodataset.fields[字段名]).loadfromfile从文件中读,或Tblobfield(adodataset.fields[字段名]).loadfromstream从stream中读,
要读出该字段内容,用相应的savetofile,savetostream就行了
注意如果是jpeg图片,要引用jpeg单元,即:uses jpeg;
综合以上,既能识别bmp又识别读jpeg,我把代码修改如下:
(建议用image,不要用dbimage控件,因为该控件只能识别bmp格式图片)
(程序已调试,运行正确delphi7 + sql server 2000)
我的数据库是这样的:
id varchar(50)
name varchar(50)
pic image(16)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids, DBGrids, DB, ADODB, StdCtrls, DBCtrls;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
DBGrid1: TDBGrid;
OpenDialog1: TOpenDialog;
Button1: TButton;
Button2: TButton;
DBImage1: TDBImage;
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses DateUtils,jpeg;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin
with ADOQuery1 do
begin
close;
SQL.Text:= ‘select * from Tpic‘;
ADOQuery1.Open;
end;
//DBImage1.DataSource:= DataSource1;
//DBImage1.DataField:= ‘pic‘;
end;
//显示
procedure TForm1.Button1Click(Sender: TObject); var
aBitmap: TBitmap;
aJPEGImage: TJPEGImage;
aStream: TStream;
head: word;
const
bmp = $4D42;
jpeg = $D8FF;
begin
aBitmap:= TBitmap.Create;
aJPEGImage:= TJPEGImage.Create; aStream:= TMemoryStream.Create;
try
TBlobField(ADOQuery1.FieldByName(‘pic‘)).SaveToStream(aStream);
aStream.Position := 0; //一定要有这句
aStream.Read(head,2);
aStream.Position:= 0;
if head = bmp then
begin
aBitmap.LoadFromStream(aStream);
Image1.Picture.Assign(aBitmap);
end
else if head = jpeg then
begin
aJPEGImage.LoadFromStream(aStream);
Image1.Picture.Assign(aJPEGImage);
end;
finally
aBitmap.Free;
aJPEGImage.Free;
aStream.Free;
end;
end;
//添加
procedure TForm1.Button2Click(Sender: TObject);
var
aBitmap: TBitmap;
aJPEGImage: TJPEGImage;
aStream: TStream;
begin
aBitmap:= TBitmap.Create;
aJPEGImage:= TJPEGImage.Create;
aStream:= TMemoryStream.Create;
try
if OpenDialog1.Execute then
begin
if ExtractFileExt(OpenDialog1.FileName)= ‘.bmp‘then
begin
aBitmap.LoadFromFile(OpenDialog1.FileName);
aBitmap.SaveToStream(aStream);
end
else if (ExtractFileExt(OpenDialog1.FileName)= ‘.jpg‘) or (Extrac tFileExt(OpenDialog1.FileName)= ‘.jpeg‘) then
begin
aJPEGImage.LoadFromFile(OpenDialog1.FileName);;
aJPEGImage.SaveToStream(aStream);
end;
with ADOQuery1 do
begin
Append;
aStream.Position:= 0;
TBlobField(FieldByName(‘pic‘)).LoadFromStream(aStream);//出错的地方:原来是因为我用了dbimage控件,该控件只能显示bmp格式图片
Post;
end;
end;
finally
aBitmap.Free;
aJPEGImage.Free;;
aStream.Free;
end;
end;
end.
主要有两种思路:
1。

图片文件保存到数据库:这种方法是将图片文件以二进制形式保存。

这种方法不但可以保存图片还可以保存电影啊优点:保密性强;致命缺点:如果图片很多会造成数据库臃肿。

2。

保存图片的绝对路径
这种方法只是保存文件的绝对路径到数据库,在访问时读取路径然后。

优点:简单,快速缺点:保密问题比较突出(误操作等)
建议:如果图片数量不是很大建议内部保存
用DBImage控件只能显示bmp图像,一个图像用bmp格式要用0.5M-几M空间,jpeg格式只有几十至几百kB。

如果图片较多,用DBImage控件显示,其程序大小是个问题。

一个程序保密要性强,也要考虑安装问题,保存图片的绝对路径,是否考虑安装的盘符。

强烈建议:用jpeg格式图像,数据库内部保存,image显示。

相关文档
最新文档