🚀 优化部分图标为小图标问题
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Drawing.Imaging;
|
using System.Drawing.Imaging;
|
||||||
@@ -10,16 +11,31 @@ namespace GeekDesk.Util
|
|||||||
{
|
{
|
||||||
public class FileIcon
|
public class FileIcon
|
||||||
{
|
{
|
||||||
|
static List<string> blurExtsList;
|
||||||
private static List<string> GetBlurExts()
|
static List<int[]> pixelList;
|
||||||
{
|
static FileIcon() {
|
||||||
List<string> list = new List<string>();
|
blurExtsList = new List<string>
|
||||||
list.Add(".exe");
|
{
|
||||||
list.Add(".cer");
|
".exe",
|
||||||
list.Add(".lnk");
|
".cer",
|
||||||
return list;
|
".lnk",
|
||||||
|
".chm"
|
||||||
|
};
|
||||||
|
pixelList = new List<int[]>
|
||||||
|
{
|
||||||
|
new int[]{ 256 / 4, 256 / 4 },
|
||||||
|
new int[]{ 256 / 2, 256 / 4 },
|
||||||
|
new int[]{ 256 / 4 * 3, 256 / 4 },
|
||||||
|
new int[]{ 256 / 4, 256 / 2 },
|
||||||
|
new int[]{ 256 / 4, 256 / 4 * 3 },
|
||||||
|
new int[]{ 256 / 4 * 3, 256 / 2 },
|
||||||
|
new int[]{ 256 / 4 * 3, 256 / 4 * 3 },
|
||||||
|
new int[]{ 256 / 2, 256 / 4 * 3 },
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[DllImport("User32.dll")]
|
[DllImport("User32.dll")]
|
||||||
public static extern int PrivateExtractIcons(
|
public static extern int PrivateExtractIcons(
|
||||||
string lpszFile, //文件名可以是exe,dll,ico,cur,ani,bmp
|
string lpszFile, //文件名可以是exe,dll,ico,cur,ani,bmp
|
||||||
@@ -53,7 +69,7 @@ namespace GeekDesk.Util
|
|||||||
ip = hIcons[0];
|
ip = hIcons[0];
|
||||||
ico = Icon.FromHandle(ip);
|
ico = Icon.FromHandle(ip);
|
||||||
}
|
}
|
||||||
else if (GetBlurExts().Contains(ext))
|
else if (blurExtsList.Contains(ext))
|
||||||
{
|
{
|
||||||
ico = Icon.ExtractAssociatedIcon(filePath);
|
ico = Icon.ExtractAssociatedIcon(filePath);
|
||||||
}
|
}
|
||||||
@@ -61,8 +77,14 @@ namespace GeekDesk.Util
|
|||||||
{
|
{
|
||||||
ip = GetJumboIcon(GetIconIndex(filePath));
|
ip = GetJumboIcon(GetIconIndex(filePath));
|
||||||
ico = Icon.FromHandle(ip);
|
ico = Icon.FromHandle(ip);
|
||||||
|
if (CheckIsSmallIco(ico.ToBitmap()))
|
||||||
|
{
|
||||||
|
ico = Icon.ExtractAssociatedIcon(filePath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Bitmap bmp = ico.ToBitmap();
|
Bitmap bmp = ico.ToBitmap();
|
||||||
MemoryStream strm = new MemoryStream();
|
MemoryStream strm = new MemoryStream();
|
||||||
|
|
||||||
@@ -73,6 +95,7 @@ namespace GeekDesk.Util
|
|||||||
myEncoderParameters.Param[0] = myEncoderParameter;
|
myEncoderParameters.Param[0] = myEncoderParameter;
|
||||||
|
|
||||||
bmp.Save(strm, myImageCodecInfo, myEncoderParameters);
|
bmp.Save(strm, myImageCodecInfo, myEncoderParameters);
|
||||||
|
|
||||||
BitmapImage bmpImage = new BitmapImage();
|
BitmapImage bmpImage = new BitmapImage();
|
||||||
bmpImage.BeginInit();
|
bmpImage.BeginInit();
|
||||||
strm.Seek(0, SeekOrigin.Begin);
|
strm.Seek(0, SeekOrigin.Begin);
|
||||||
@@ -82,6 +105,7 @@ namespace GeekDesk.Util
|
|||||||
{
|
{
|
||||||
Shell32.DestroyIcon(ip);
|
Shell32.DestroyIcon(ip);
|
||||||
}
|
}
|
||||||
|
DeleteObject(bmp.GetHbitmap());
|
||||||
return bmpImage.Clone();
|
return bmpImage.Clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,6 +122,30 @@ namespace GeekDesk.Util
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool CheckIsSmallIco(Bitmap bm)
|
||||||
|
{
|
||||||
|
Color color;
|
||||||
|
int count = 0;
|
||||||
|
foreach (int[] arr in pixelList)
|
||||||
|
{
|
||||||
|
color = bm.GetPixel(arr[0], arr[1]);
|
||||||
|
if (color.A == 0)
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DeleteObject(bm.GetHbitmap());
|
||||||
|
if (count >= 6)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
|
||||||
|
public static extern bool DeleteObject(IntPtr onj);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static int GetIconIndex(string pszFile)
|
public static int GetIconIndex(string pszFile)
|
||||||
|
|||||||
Reference in New Issue
Block a user