[英]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.