请问:怎样将sql数据库中存储的图像数据显示成缩略图方式,当点击某个缩略图时就将此图显示成大图,就像ACDsee一样。最好有源代码:)谢谢各位富翁了 ( 积分:

  • 主题发起人 主题发起人 delphi3058
  • 开始时间 开始时间
D

delphi3058

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:怎样将sql数据库中存储的图像数据显示成缩略图方式,当点击某个缩略图时就将此图显示成大图,就像ACDsee一样。最好有源代码:)谢谢各位富翁了 ( 积分: 100 )<br />请问:怎样将sql数据库中存储的图像数据显示成缩略图方式,当点击某个缩略图时就将此图显示成大图,就像ACDsee一样。最好有源代码:)谢谢各位富翁了
 
控制一下显示images控件的面积不就行了,先是一个小的,点击后弹个大的出来
 
我可给您定做一个,您可以看看我们的软件:凌霄图像批处理专家.&nbsp;下载网址:www.flyingspace.com<br>QQ:9863231
 
Zerel的方法不可行,通常显示小图的目的,是为了网速,照你的方法,读的数据大小还是一样,达不到显示缩略图的目的。<br><br>可以在表中设置两个字段,一个用于保存大图,一个用于保存小图,显示目录的时候,先读小图,然后根据用户选中的情况去读大图的数据。<br>生成缩略图的过程如下<br>//改变图片至指定大小(保持纵横比,如果图片小于指定尺寸,则不变)<br>Procedure&nbsp;ZoomPic(const&nbsp;SourceStream:TMemoryStream;&nbsp;Const&nbsp;MaxWidth,MaxHeight:Integer;&nbsp;var&nbsp;DescStream:TMemoryStream;&nbsp;KeepRate:Boolean&nbsp;=&nbsp;True);<br>var&nbsp;&nbsp;&nbsp;SourceJpg,Jpg:&nbsp;TJPEGImage;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bmp:&nbsp;TBitmap;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Width,&nbsp;Height:&nbsp;Integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpScale:&nbsp;Double;<br>begin<br>&nbsp;&nbsp;Jpg:=&nbsp;TJPEGImage.Create;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取源文件<br>&nbsp;&nbsp;bmp&nbsp;:=&nbsp;TBitmap.Create;<br>&nbsp;&nbsp;SourceJpg&nbsp;:=&nbsp;TJPEGImage.Create;<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;SourceJpg.LoadFromStream(SourceStream);<br>&nbsp;&nbsp;&nbsp;&nbsp;//计算缩小比例<br>&nbsp;&nbsp;&nbsp;&nbsp;//图片小,保持不变<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;KeepRate&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(SourceJpg.Width&lt;=MaxWidth)&nbsp;and<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SourceJpg.Height&lt;=MaxHeight)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Width&nbsp;&nbsp;:=&nbsp;SourceJpg.Width;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Height&nbsp;:=&nbsp;SourceJpg.Height;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpScale:=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;SourceJpg.Width/SourceJpg.Height&nbsp;&gt;=&nbsp;MaxWidth/MaxHeight&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpScale:=&nbsp;SourceJpg.Width&nbsp;/&nbsp;MaxWidth<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TmpScale:=&nbsp;SourceJpg.Height&nbsp;/&nbsp;MaxHeight;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Width:=Round(SourceJpg.Width&nbsp;/&nbsp;TmpScale);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Height:=Round(SourceJpg.Height&nbsp;/&nbsp;TmpScale);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Width:=MaxWidth;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Height:=MaxHeight;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End;<br>&nbsp;&nbsp;&nbsp;&nbsp;bmp.Width&nbsp;:=&nbsp;Width;<br>&nbsp;&nbsp;&nbsp;&nbsp;bmp.Height&nbsp;:=&nbsp;Height;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;SourceJpg.PixelFormat&nbsp;=&nbsp;jf24bit&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp.PixelFormat&nbsp;:=&nbsp;pf24bit&nbsp;&nbsp;&nbsp;//指定格式<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp.PixelFormat&nbsp;:=&nbsp;pf8bit;<br>&nbsp;&nbsp;&nbsp;&nbsp;bmp.Canvas.StretchDraw(Rect(0,0,Width,Height),&nbsp;SourceJpg);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//保存<br>&nbsp;&nbsp;&nbsp;&nbsp;jpg.Assign(bmp);<br>//&nbsp;&nbsp;&nbsp;&nbsp;jpg.CompressionQuality:=round(SourceJpg.CompressionQuality&nbsp;/&nbsp;tmpScale);<br>//&nbsp;&nbsp;&nbsp;&nbsp;jpg.JPEGNeeded;<br>//&nbsp;&nbsp;&nbsp;&nbsp;jpg.Compress;<br>&nbsp;&nbsp;&nbsp;&nbsp;DescStream.Clear;<br>&nbsp;&nbsp;&nbsp;&nbsp;jpg.SaveToStream(DescStream);<br>&nbsp;&nbsp;&nbsp;&nbsp;DescStream.Position:=0;<br>&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;Bmp.Free;<br>&nbsp;&nbsp;&nbsp;&nbsp;Jpg.Free;<br>&nbsp;&nbsp;&nbsp;&nbsp;SourceJpg.Free;<br>&nbsp;&nbsp;end;<br>end;<br>参数含义:<br>SourceStream&nbsp;&nbsp;源JPG图片的内存流变量,<br>MaxWidth&nbsp;&nbsp;指定缩略图的宽度,<br>MaxHeight&nbsp;指定缩略图的高度<br>DescStream&nbsp;保存生成缩略图的内存变量<br>KeepRate&nbsp;&nbsp;是否保持纵横比例不变<br><br>调用方法如<br>Var&nbsp;JpgMem:TMemoryStream;<br><br>&nbsp;JpgMem:=TMemoryStrem.Create;<br>&nbsp;JpgMem.LoadFromFile('F:/abc.jpg');<br>&nbsp;ZoomPic(JpgMem,60,60,JpgMem,True);<br>&nbsp;...<br>&nbsp;JpgMem.free;
 
To&nbsp;levi:怎样显示在程序界面上呢?谢谢了!我需要同时显示多幅图片,就象listview的大图标方式那样,当点击某一个项目时,此项目的大图就显示出来了.象ACDSEE一样.谢谢
 
用TDrawGrid,自己往上画,我有做过,比较好实现的,然后根据点击的位置,打开大图就可以了。<br><br>使用DRAWgrid时,在DrawGrid1DrawCell事件中,可以调用如下的函数,画上图片,以及文字,以及实现选中后,文字蓝色显示的功能。<br>Procedure&nbsp;MyDrawGridCell(Sender:&nbsp;TObject;&nbsp;Rect:&nbsp;TRect;&nbsp;State:&nbsp;TGridDrawState;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bmp:TBitmap;&nbsp;ShowWords:String;&nbsp;Pos:Integer;&nbsp;TxtHeight:Integer);<br>var<br>&nbsp;&nbsp;BmpRect:TRect;<br>&nbsp;&nbsp;x,y:Integer;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;&nbsp;TDrawGrid(Sender).Canvas&nbsp;&nbsp;do&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Brush.Color&nbsp;&nbsp;:=&nbsp;&nbsp;clWhite;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FillRect(Rect);&nbsp;&nbsp;//清空<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;StrisEmpty(ShowWords)&nbsp;and&nbsp;(Bmp=nil)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//居中显示图片<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BmpRect:=Rect;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BmpRect.Bottom:=BmpRect.Bottom-TxtHeight;&nbsp;//预留文字部分空间<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x:=(BmpRect.Right-BmpRect.Left-Bmp.Width)&nbsp;div&nbsp;2;&nbsp;&nbsp;&nbsp;//宽度居中数据<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y:=(BmpRect.Bottom-BmpRect.Top-Bmp.Height)&nbsp;div&nbsp;2;&nbsp;&nbsp;//高度居中数据<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BmpRect.Top:=BmpRect.Top+y;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BmpRect.Bottom:=BmpRect.Bottom-y;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BmpRect.Left:=BmpRect.Left+x;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BmpRect.Right:=BmpRect.Right-x;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Bmp&nbsp;&lt;&gt;&nbsp;nil&nbsp;then&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bmp.Transparent&nbsp;&nbsp;:=&nbsp;&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bmp.TransParentColor&nbsp;&nbsp;:=&nbsp;&nbsp;TDrawGrid(Sender).Color;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CopyRect(BmpRect,Bmp.Canvas,Bmp.Canvas.ClipRect);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//画分隔线<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BmpRect.Bottom:=BmpRect.Bottom+y;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rectangle(Rect.Left,BmpRect.Bottom,Rect.Right,BmpRect.Bottom+1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写序号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Pos&gt;0&nbsp;then&nbsp;begin&nbsp;&nbsp;&nbsp;&nbsp;//传递负数表示不显示序号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x:=Rect.Left+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y:=Rect.Top+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Font.Color:=clBlack;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOut(x,y,InttoStr(Pos));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//居中写文字<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;TextWidth(ShowWords)&gt;(Rect.Right-Rect.Left)&nbsp;then&nbsp;&nbsp;//如果文字太大,要显示省略号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showWords:=Copy(ShowWords,1,(Rect.Right-Rect.Left)&nbsp;div&nbsp;TextWidth('A')-3)+'...';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x:=Rect.Left+(Rect.Right-Rect.Left-TextWidth(ShowWords))&nbsp;div&nbsp;2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//居中显示<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y:=BmpRect.Bottom+(TxtHeight-TextHeight(ShowWords))&nbsp;div&nbsp;2;&nbsp;&nbsp;&nbsp;//居中显示<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;gdFocused in&nbsp;State&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Font.Color:=clBlue<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Font.Color:=clBlack;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOut(x,y,ShowWords);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;
 
为加快速度,可以分页获取缩略图的图片,并分页显示,可以将取得的图片放在ClientDataSet中,然后根据选中的单元格位置,计算出记录的位置,再读出图片供显示使用。否则显示了,一刷新后就没有图片了。<br>读缩略图并存储到CDS中的函数如下:<br>procedure&nbsp;TfrSample.ShowClass;<br>var&nbsp;i:Integer;<br>&nbsp;&nbsp;tpQuery:TAdoQuery;<br>&nbsp;&nbsp;tpProvider:TDataSetProvider;<br>begin<br>&nbsp;&nbsp;if&nbsp;Not&nbsp;Assigned(utDs)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;utDs:=TClientDataSet.Create(nil);<br>&nbsp;&nbsp;tpQuery:=TAdoQuery.Create(Nil);<br>&nbsp;&nbsp;tpProvider:=TDataSetProvider.Create(Nil);<br>&nbsp;&nbsp;tpProvider.DataSet:=tpQuery;<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;tpQuery&nbsp;do&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection:=utConn;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sql.Clear;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql.Add('Select&nbsp;*&nbsp;From&nbsp;xxxxx');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Open;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utDs.Data:=tpProvider.Data;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;Finally<br>&nbsp;&nbsp;&nbsp;&nbsp;tpProvider.Free;<br>&nbsp;&nbsp;&nbsp;&nbsp;tpQuery.Free;<br>&nbsp;&nbsp;end;<br>end;<br>//utDS是定义的一个全局变量&nbsp;&nbsp;utds:TClientDataSet;
 
后退
顶部