提取Office图标的方法
需求
几年前,好声音以独特节目形式吸引了很多选手和观众的 观注,旨在"只寻找优质声音"; 可声音各有特色时,还得看颜值,当然这也无可厚非。虽然扯得有点远,我想表达的是软件开发的稳定性与美观性之间的平衡问题,亦或是功能需求与用户体验关系把握问题。有人认为只是功能强大,满足需求,界面是次要的;而实际结果,功能也并不强大,界面操作也十分复杂;我个人观点正好相反,如果我们的软件并不能达到功能强大,运行稳定,我们更得加强界面的开发,正确地引导用户,减少出错机率。
下面是Excel 2019 的界面,引领着整个行业的界面风格:

现在需要将其图标提取怎么操作?
实现
通过一些图标提取软件都无法提取,唯一可以使用的方法是调有官方的GetImageMso方法。
开发环境:VS2019+VSTO,以Excel为例。
首先新建一个Add In工程:

其次,在ThisAddIn类里创建一个Application对象,以便全局访问。
public static Excel.Application App;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
App = this.Application;
}
然后,添加一个Ribbon,并新增按键及相关事件。

接着,使用GetImageMso方法下载相应名称、大小的图片。
IPictureDisp pictureDisp = ThisAddIn.App.CommandBars.GetImageMso(name, 32, 32);
最后,将IPictureDisp转化透明图标输出,这是第二个关键点:
public class ImageHelper
{
/// <summary>
/// IPictureDisp转Bitmap
/// </summary>
/// <param name="ipd">IPictureDisp</param>
/// <returns>Bitmap</returns>
public static Bitmap ConvertPixelByPixel(IPictureDisp ipd)
{
// get the info about the HBITMAP inside the IPictureDisp
var dibsection = new DIBSECTION();
GetObjectDIBSection((IntPtr)ipd.Handle, Marshal.SizeOf(dibsection), ref dibsection);
var width = dibsection.dsBm.bmWidth;
var height = dibsection.dsBm.bmHeight; // create the destination Bitmap object
var bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb); unsafe
{
// get a pointer to the raw bits
var pBits = (RGBQUAD*)(void*)dibsection.dsBm.bmBits; // copy each pixel manually
for (var x = 0; x < dibsection.dsBmih.biWidth; x++)
for (var y = 0; y < dibsection.dsBmih.biHeight; y++)
{
var offset = y * dibsection.dsBmih.biWidth + x;
if (pBits[offset].rgbReserved != 0)
{
bitmap.SetPixel(x, y, Color.FromArgb(pBits[offset].rgbReserved, pBits[offset].rgbRed, pBits[offset].rgbGreen, pBits[offset].rgbBlue));
}
}
}
return bitmap;
} [StructLayout(LayoutKind.Sequential)]
private struct RGBQUAD
{
public byte rgbBlue;
public byte rgbGreen;
public byte rgbRed;
public byte rgbReserved;
} [StructLayout(LayoutKind.Sequential)]
public struct BITMAP
{
public int bmType;
public int bmWidth;
public int bmHeight;
public int bmWidthBytes;
public short bmPlanes;
public short bmBitsPixel;
public IntPtr bmBits;
} [StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFOHEADER
{
public int biSize;
public int biWidth;
public int biHeight;
public short biPlanes;
public short biBitCount;
public int biCompression;
public int biSizeImage;
public int biXPelsPerMeter;
public int biYPelsPerMeter;
public int biClrUsed;
public int bitClrImportant;
} [StructLayout(LayoutKind.Sequential)]
public struct DIBSECTION
{
public BITMAP dsBm;
public BITMAPINFOHEADER dsBmih;
public int dsBitField1;
public int dsBitField2;
public int dsBitField3;
public IntPtr dshSection;
public int dsOffset;
} [DllImport("gdi32.dll", EntryPoint = "GetObject")]
public static extern int GetObjectDIBSection(IntPtr hObject, int nCount, ref DIBSECTION lpObject);
}

成果
Word图标:

Excel图标:

PowerPoint图标:

Project图标:

Visio 图标:

打包图片资源下载:
https://download.csdn.net/download/ADKIIDGTFK926/12078303
参考
https://blog.csdn.net/blackwoodcliff/article/details/89891405
https://github.com/OfficeDev/office-fluent-ui-command-identifiers
提取Office图标的方法的更多相关文章
- Office系列---将Office文件(Word、PPT、Excel)转换为PDF文件,提取Office文件(Word、PPT)中的所有图片
将Office文件转换为PDF文件,提取Office文件中的所有图片 1.Office系列---将Office文件(Word.PPT.Excel)转换为PDF文件 1.1 基于Office实现的解决方 ...
- Jmeter正则表达式提取器的使用方法(转)
下面简单介绍一下Jmeter正则表达式提取器的使用方法. 1.添加Jmeter正则表达式提取器:在具体的Request下添加Jmeter正则表达式提取器(Jmeter正则表达式在“后置处理器”下面) ...
- Microsoft Office 2013 激活方法
Microsoft Office 2013 激活方法 Microsoft Office 2013是微软的新一代Office办公软件,全面采用Metro界面,包括Word.PowerPoint.Ex ...
- javascript 正则匹配 提取所有 preg_match_all matchAll方法
javascript 提取全部的的方法.javascript中没有matchAll这种方法. 用while来实现类似 PHP 中的preg_match_all() :(by default7#zbph ...
- python提取文件中的方法名称
#提取文件中的方法名称 # -*- coding:utf-8 -*- def Query_Method(filepath): file = open(filepath,'r',encoding= 'U ...
- win10 常用设置 桌面出来计算机图标,固定桌面摆好的图标设置方法,电脑设备ID方法
win10 常用设置 桌面出来计算机图标,固定桌面摆好的图标设置方法 桌面右键-->显示设置-->桌面图标设置 电脑设备ID:xxx查看方法:桌面右键-->显示设置-->关于
- SVN 不显示状态图标--解决方法
[SVN 不显示状态图标--解决方法] 在名字前面加空格, 三个六个空格随意: 参考:https://www.cnblogs.com/lzpong/p/6187366.html
- imx6q Xorg下Qt应用开机自启动及添加桌面快捷启动图标的方法
启动scene3d例子: root@imx6qsabresd:/etc/X11/Xsession.d# ls -altotal 36drwxr-xr-x 2 root root 4096 Mar 12 ...
- xcode打正式包提示缺少icon图标解决方法
报如下错,是说缺少ipad图标 解决方法 如下图创建图标库 打开新建的图标库文件夹中的contents.josn文件,把下面的代码复制到原来的图标库(可以不进行上一步建图标库,手动添加也可以) 然后把 ...
随机推荐
- [springMvc]常见配置
[springMvc]常见配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...
- Android studio 3.4 新建项目报错Error:unable to resolve dependency for app@。。。解决办法
试过网上很多的例子,有的设置Go to `File->Settings->Build, Execution, Deployment->Gradle->Uncheck Offli ...
- Mac环境下执行npm install报权限错误解决办法
1. 一般情况 sudo npm install 注:这相当于windows系统中的 以管理员身份执行,加上sudo后会要求你输入苹果账号密码,而且在输入的时候是没有字符提示的,密码输入完直接按回车就 ...
- [Go] 轻量服务器框架tcp的粘包问题 封包与拆包
tcp传输的数据是以流的形式传输的,因此就没有办法判断到哪里结束算是自己的一个消息,这样就会出现粘包问题,多个包粘在一起了 可以使用这样一个自定义的形式来解决,一个消息分为 head+body he ...
- javascript---简介的切换图片效果。
<!--切换图片--> <img src="img/9.gif" alt="" id="img"> <butt ...
- 【Postman】举例实战——天气查询
准备工作: 1.下载postman(搜索官网下载即可) 2.接口文档(以聚合上去免费API:天气查询接口) 打开postman: 1.输入url 2.请求方式 3.请求参数 4.在postman中运行 ...
- 【oracle】ORA-00947: 没有足够的值
insert 时 对应NOT NULL 的列 必须有值
- <String> 161 358
161. One Edit Distance 1. 两个字符串的长度之差大于1,直接返回False. 2. 两个字符串的长度之差等于1,长的那个字符串去掉一个字符,剩下的应该和短的字符串相同. 3. ...
- C语言中的顺序点
C语言盲点1.函数参数的求值顺序依赖于编译器,例如f(a,a++);是先求a++还是求a不一定 2.C语言中的大多数运算符对其操作数的求值顺序也依赖于编译器 警告int i = f() * g();这 ...
- SpringBoot与数据层
1.JDBC <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...