簡體   English   中英

將圖片快速加載到圖片框

[英]load image in picturebox quickly

我有一個程序可以在小圖片框中顯示jpg的預覽。 這些圖像的加載速度很慢,每個圖像幾乎要花費一秒鍾的時間。 那是因為圖像很大(8/9 mB)。 我需要快速加載它們,例如通過加載圖片的縮略圖。 我想避免將所有內容都放入內存中,因為可能會有數百張圖片。

您對此有何建議?

謝謝

您需要預先調整圖片大小。

創建縮略圖的速度同樣會很慢,因為您需要先讀取整個文件,然后才能開始制作該縮略圖。

與Windows一樣,您可以做的是創建一個圖釘“數據庫”,在其中存儲每張圖片的圖釘。 並且僅在需要時使用全尺寸圖片。

所以如果你喜歡

picture001.jpg
picture002.jpg
picture003.jpg

為每一個創建Tumb;

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

因此,在加載圖片時會檢測_tumb.jpg是否存在,如果沒有創建並存儲它。 當然,這需要在后台工作人員中完成,因為您需要主應用程序來響應...

您也可以使用此代碼從Windows Shell請求圖標。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM