簡體   English   中英

在c#中從文件中提取縮略圖和圖標

[英]Extracting thumbnail and icon from file in c#

如果縮略圖不能從像Windows資源管理器這樣的文件或文件夾中獲得,我正在嘗試提取縮略圖或圖標。 我正在使用IShellItemImageFactory,當縮略圖存在時,它可以很好地工作。 但是,如果文件沒有縮略圖,則該方法返回的圖標具有黑色背景。

懷疑這是因為當我調用Bitmap.FromHbitmap將hbitmap轉換為位圖時,透明度會丟失。 是否有可能在不失透明度的情況下進行轉換? 我甚至不確定這是不是問題。 我能找到的唯一參考是對IShellItemImageFactory的問題的評論

“API有時返回使用預乘alpha的位圖,有時使用正常alpha的位圖”

有什么方法可以獲得沒有黑色背景的圖標,或者我只是在沒有縮略圖時堅持使用Icon.ExtractAssociatedIcon

我使用以下代碼,不確定它是否支持透明背景,但你可以嘗試一下:

private const uint SHGFI_ICON           = 0x100;
private const uint SHGFI_LARGEICON      = 0x0;
private const uint SHGFI_SMALLICON      = 0x1;
private const uint SHGFI_DISPLAYNAME    = 0x00000200;
private const uint SHGFI_TYPENAME       = 0x400;

public static Icon GetSmallFileIcon(this FileInfo file)
{
    if (file.Exists)
    {
        SHFILEINFO shFileInfo = new SHFILEINFO();
        SHGetFileInfo(file.FullName, 0, ref shFileInfo, (uint)Marshal.SizeOf(shFileInfo), SHGFI_ICON | SHGFI_SMALLICON);

        return Icon.FromHandle(shFileInfo.hIcon);
    }
    else return SystemIcons.WinLogo;
}

public static Icon GetSmallFileIcon(string fileName)
{
    return GetSmallFileIcon(new FileInfo(fileName));
}

public static Icon GetLargeFileIcon(this FileInfo file)
{
    if (file.Exists)
    {
        SHFILEINFO shFileInfo = new SHFILEINFO();
        SHGetFileInfo(file.FullName, 0, ref shFileInfo, (uint)Marshal.SizeOf(shFileInfo), SHGFI_ICON | SHGFI_LARGEICON);

        return Icon.FromHandle(shFileInfo.hIcon);
    }
    else return SystemIcons.WinLogo;
}

public static Icon GetLargeFileIcon(string fileName)
{
    return GetLargeFileIcon(new FileInfo(fileName));
}

[StructLayout(LayoutKind.Sequential)]
public struct SHFILEINFO
{
    public SHFILEINFO(bool b)
    {
        hIcon = IntPtr.Zero; iIcon = IntPtr.Zero; dwAttributes = 0; szDisplayName = ""; szTypeName = "";
    }

    public IntPtr hIcon;
    public IntPtr iIcon;
    public uint dwAttributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string szDisplayName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string szTypeName;
};


[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);

返回的位圖具有alpha。 它是32位,最后8位是alpha。 我不確定你在調用Bitmap.FromHbitmap時會發生什么,但是你應該知道即使alpha被正確復制(可能是),你也可能以后不再使用它。 如果忽略alpha,你會看到一個黑盒子。

暫無
暫無

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

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