2013-08-16 123 views
2

我有一个程序,显示jpgs在小图片盒中的预览。这些图像的加载速度很慢,每个图像几乎需要一秒钟。这是因为图像很大(8/9 mB)。我需要快速加载它们,例如通过加载图片的大拇指。我想避免把所有内容都放入内存中,因为可能有数百张图片。快速在picturebox中加载图像

你对此有何建议?

THanks

+0

它可能很慢,因为每个图像正在被图片框调整大小,并且调整大小是CPU密集型操作。正确大小的缩略图无疑会解决问题。你是通过网络获取你的图片吗?如果是这样,请让您的服务器生成缩略图。 – dandan78

+0

nope,它在本地驱动器上... – sharkyenergy

回答

1

您需要提前调整图片大小。

创建缩略图的速度同样缓慢,因为在开始制作缩略图之前,您需要阅读整个文件。

你可以做的就是,就像windows一样,创建一个tumbnail“数据库”,在这里你存储每张图片的tumbs。如果需要,只能使用全尺寸的图片。

所以,如果你有一个像,

picture001.jpg 
picture002.jpg 
picture003.jpg 

创建为每一个tumbs;

picture001.jpg 
picture001_tumb.jpg 
picture002.jpg 
picture002_tumb.jpg 
picture003.jpg 
picture003_tumb.jpg 

所以在picuters检测的加载中,如果_tumb.jpg存在,如果没有创建并存储它。当然,需要在后台工作人员完成,因为你需要你的主应用程序来响应...

你也可以使用此代码,从Windows外壳请求图标;

Imports System.Runtime.InteropServices 
Imports System 
Imports System.Drawing 
Imports System.Drawing.Imaging 
Imports System.Collections.Generic 
Imports System.Text 

' http://www.vbforums.com/showthread.php?617626-How-do-I-extract-a-256X256-image-out-of-an-icon&highlight=IShellItemImageFactory 

Module GetShellIcon 
    <Flags()> _ 
    Public Enum SIIGBF 
     SIIGBF_RESIZETOFIT = 0 
     SIIGBF_BIGGERSIZEOK = 1 
     SIIGBF_MEMORYONLY = 2 
     SIIGBF_ICONONLY = 4 
     SIIGBF_THUMBNAILONLY = 8 
     SIIGBF_INCACHEONLY = 16 
    End Enum 

    Public Enum SIGDN As UInteger 
     NORMALDISPLAY = 0 
     PARENTRELATIVEPARSING = &H80018001UI 
     PARENTRELATIVEFORADDRESSBAR = &H8001C001UI 
     DESKTOPABSOLUTEPARSING = &H80028000UI 
     PARENTRELATIVEEDITING = &H80031001UI 
     DESKTOPABSOLUTEEDITING = &H8004C000UI 
     FILESYSPATH = &H80058000UI 
     URL = &H80068000UI 
    End Enum 

    <ComImportAttribute(), GuidAttribute("bcc18b79-ba16-442f-80c4-8a59c30c463b"),  InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)> _ 
    Public Interface IShellItemImageFactory 
     Sub GetImage(ByVal size As SIZE, ByVal flags As SIIGBF, ByRef phbm As IntPtr) 
    End Interface 

    <ComImport()> <Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe")>  <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _ 
    Public Interface IShellItem 
     Sub BindToHandler(ByVal pbc As IntPtr, <MarshalAs(UnmanagedType.LPStruct)>  ByVal bhid As Guid, <MarshalAs(UnmanagedType.LPStruct)> ByVal riid As Guid, ByRef ppv As  IntPtr) 
     Sub GetParent(ByRef ppsi As IShellItem) 
     Sub GetDisplayName(ByVal sigdnName As SIGDN, ByRef ppszName As IntPtr) 
     Sub GetAttributes(ByVal sfgaoMask As UInt32, ByRef psfgaoAttribs As UInt32) 
     Sub Compare(ByVal psi As IShellItem, ByVal hint As UInt32, ByRef piOrder As  Integer) 
    End Interface 

    <DllImport("shell32.dll", CharSet:=CharSet.Unicode, PreserveSig:=False)> _ 
    Public Sub SHCreateItemFromParsingName(<MarshalAs(UnmanagedType.LPWStr)> ByVal  pszPath As String, ByVal pbc As IntPtr, <MarshalAs(UnmanagedType.LPStruct)> ByVal riid As  Guid, <MarshalAs(UnmanagedType.Interface, IidParameterIndex:=2)> ByRef ppv As IShellItem) 
    End Sub 

    <StructLayout(LayoutKind.Sequential)> _ 
    Public Structure SIZE 
     Public cx As Integer 
     Public cy As Integer 
     Public Sub New(ByVal cx As Integer, ByVal cy As Integer) 
      Me.cx = cx 
      Me.cy = cy 
     End Sub 
    End Structure 

    Public Function GetShellIcon(ByVal Path As String, MySIIGBF As SIIGBF, Optional ByVal Width As Integer = 256, Optional ByVal Height As Integer = 256) As Bitmap 

     Dim ppsi As IShellItem = Nothing 
     Dim hbitmap As IntPtr = IntPtr.Zero 
     Dim uuid As New Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe") 

     Dim bs As Bitmap 

     SHCreateItemFromParsingName(Path, IntPtr.Zero, uuid, ppsi) 
     DirectCast(ppsi, IShellItemImageFactory).GetImage(New SIZE(Width, Height), MySIIGBF, hbitmap) 
     bs = System.Drawing.Bitmap.FromHbitmap(hbitmap) 
     bs.MakeTransparent(Color.Black) 

     Return bs 

    End Function 

End Module 
+0

是有道理的..有没有甚至解决这个问题? – sharkyenergy

+0

谢谢,是否有一个Windows自动执行的命令?或读出来?通过使用Windows标准我的意思是..如果我让驱动器充满缩略图,用户会杀了我.. – sharkyenergy

+0

最好的事情,当然,挂钩到现有的系统。我知道windows创建一个tumb_db文件,其中包含该文件夹中每个图像的tumbs。你可以尝试找出一种方法来读取窗口的tumb数据库...你不必重新发明轮子:) – Lectere