如果缩略图不能从像Windows资源管理器这样的文件或文件夹中获取,我正在尝试提取缩略图或图标。我正在使用IShellItemImageFactory,当缩略图存在时,它可以很好地工作。但是,如果文件没有缩略图,则该方法返回的图标为黑色背景。
我怀疑这是因为当我调用Bitmap.FromHbitmap
将hbitmap转换为位图时,透明度会丢失。是否有可能在不失透明度的情况下进行转换?我甚至不确定这是不是问题。我能找到的唯一参考是对question about IShellItemImageFactory的评论,其中说明了
“API有时会返回位图 使用预乘的alpha和 有时使用正常的alpha“
有没有办法让图片没有黑色背景,或者在没有缩略图时我应该坚持Icon.ExtractAssociatedIcon
?
答案 0 :(得分:3)
我使用以下代码,不确定是否支持透明背景,但您可以尝试一下:
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);
答案 1 :(得分:1)
返回的位图有alpha。它是32位,最后8位是alpha。我不确定你在调用Bitmap.FromHbitmap时会发生什么,但是你应该知道即使alpha被正确复制(可能是),你也可能以后不再使用它。如果忽略alpha,你会看到一个黑盒子。