VB6.0與SQL Server2000,當把圖形存進SQL Server中.然後在窗體上加載此圖片時,如果選擇的圖片超過1M,會產生視覺上的停頓,給人有點不舒服的感覺,我現在試過兩種方式,用於把SQL Server中圖形讀到窗體控件,都一樣,請教有沒有更好的方式,不產生停頓。以下是列出我使用的兩種方式:
一種:使用二進制文件處理方式把圖片數據轉成文件:
Public Sub LoadFromDB(ByRef fld As ADODB.Field, objPic As Object)
    Dim byteData() As Byte
    Dim SourceFile As Long
    Dim strFile As String
    Dim FileLength As Long
    
    On Error GoTo errLoad
    If IsNull(fld.Value) Then
        objPic.Picture = LoadPicture("")
        Exit Sub
    End If
    SourceFile = FreeFile()
    strFile = g_WinDir & "\Temp"
    Call fCreateDir(strFile)
    strFile = strFile & "\~" & GetString(False) & ".tmp"
    If FileExists(strFile) Then Kill strFile
    Open strFile For Binary Access Write As SourceFile
    FileLength = fld.ActualSize
    ReDim byteData(FileLength) As Byte
    byteData() = fld.GetChunk(FileLength)
    Put SourceFile, , byteData()
    Close SourceFile
    objPic = LoadPicture(strFile)
    Kill strFile
    Exit Sub
errLoad:
    If Err.Number <> 0 Then
        MsgBox Err.Number & ";" & Err.Description, vbInformation + vbOKOnly, "加載圖片"
    End If
End Sub二種:通過ADO的流操作,直接把圖形數據存為圖形文件後再加載。
Public Sub LoadImageFromDB(ByVal fld As ADODB.Field, objPic As Object)
    Dim c As New ADODB.Stream
    Dim strFile As String
    
    On Error GoTo errLoad
    '如果圖片內容為空
    If IsNull(fld.Value) Then
        objPic.Picture = LoadPicture("")
        Exit Sub
    End If
    '開始從數據庫中讀取圖片
    c.Mode = adModeReadWrite
    c.Type = adTypeBinary
    c.Open
    c.Write (fld.Value)
    '生成臨時文件路徑
    strFile = g_WinDir & "\Temp"
    Call fCreateDir(strFile)
    strFile = strFile & "\~" & GetString(False) & ".tmp"
    If FileExists(strFile) Then Kill (strFile)
    c.SaveToFile strFile, adSaveCreateOverWrite
    objPic.Picture = LoadPicture(strFile)
    '刪除臨時文件
    Kill strFile
    Exit Sub
errLoad:
    If Err.Number <> 0 Then
        MsgBox Err.Number & ";" & Err.Description, vbInformation + vbOKOnly, "加載圖片"
    End If
End Sub

解决方案 »

  1.   

    这么大的照片有延迟很正常
    使用adodc控件数据绑定图像框,这样效果可能会好点,因启动时,数据已经加载,仅写查询语句查询即可
      

  2.   

    读取数据量大,就会有读的过程,就会有等待,读写磁盘更是耗时。几点建议,仅供参考:
    1、加一个进度条,进度条让人感觉这1秒过得是很多的。
    2、加大SQL Server系统缓存,第一次调用时慢,以后就会快。
    3、考虑把图片文件名放入数据库,把图片放入一个文件夹,然后调用
      

  3.   

    1)不要用原始的 bmp 格式图片,先用工具转换成 jpg 或 gif 格式。2)图片没必要存放到数据库中,记录中只要有文件名就可以了。
     如果是局域网,将图片文件存放在服务端的共享目录中,客户端将共享目录映射为固定盘符的本地网络驱动器,就能当作一般文件进行 LoadPicture 了。
     如果速度还不理想,你可以在程序启动时,将映射目录中的图片文件复制到本地目录中,本地文件 LoadPicture 应该是最快的了。
      

  4.   

    因為程式,有時用戶需要在台灣或香港使用,而服務器在大陸,如果存文件名,則在外地是沒辦法看到圖片的,至於JPG,當圖片尺寸是1024*768或更大一點像素,依然會有點點延遲!這個主要體現在,由表格界面(不加載圖片)轉換到編輯界面(加載圖片),會有一點停頓的感覺!
      

  5.   

    有很多图片吗?如果不是一定要放入数据库,
    将图片放入一个imagelist,然后读取,这样的速度是不是快很多倍.
      

  6.   

    通过广域网,只要是大图片,用 IE 显示也是需要加载时间的。如果图片不是很敏感,可以放在 Web Server 的目录下;客户端通过文件名组合成一个 URL,用 WebBrower 控件查看,这样 IE 内核会自动将图片缓存到本地,除了初次打开、以后重复显示就会很快了。如果图片比较敏感,可以提供 FTP 下载,这比数据库存取占用资源少;不过客户端要自己实现在本地的缓存。
      

  7.   

    不使用临时缓冲文件,可以提高显示速度,具体可参考我博客里《VB直接保存和显示ACCESS数据库中的图像数据》和《如何直接显示内存中的二进制图像数据》两篇文章。
      

  8.   

    我觉得那么大的文件肯定需要时间读写,你可以放一个备用的picturebox
    在开始前把这个picturebox显示出来,隐藏你需要读写的那个picturebox,等到读写完毕再交换过来。有的时候短暂的停顿是可以接受的,关键是让用户感觉到舒服