我发现了很多的漂亮图标从Microsoft Office 2007中你的任何想法和提取使用VBA保存所有图标为PNG文件?
部分imageMso http://rabu4g.bay.livefilestore.com/y1p2SF1q63YjDjPNmK4nYMW2644r9AO2aAsE__vBYznTeXD0b4SJUU0O07fxPD0r7aO_83gCJ-8OfcOQsFKG0fQMRnTEneBU1TI/Capture.PNG
下面的代码是用来从ImageMSO获取图像的代码。
Application.CommandBars.GetImageMso([name], [width], [height])
我可以显示所有的PictureBox控件和保存Excel文件作为网页。 然而,每一个图标是非常低的质量。
此外,我尝试创建C#Excel加载项目通过使用下面的代码出口为位图对象。 但是我发现,它不能导出为半透明PNG。
stdole.IPictureDisp p = Application.CommandBars.GetImageMso(fileName, size, size);
Bitmap b = Bitmap.FromHbitmap((IntPtr)p.Handle, (IntPtr)p.hPal);
PS。 我要保存所有图标为PNG格式,因为我需要使用它的半透明的功能。 它允许我使用大多数背景颜色不是白色背景更所有图标。
我用ImageMso相当频繁出现在我的Excel的发展。 对这个职位已经迷迷糊糊的,我把它更进一步,把包一起在视觉搜索,提取和保存图标从Microsoft Excel的文件或复制并粘贴(alpha通道透明度)到另一个应用程序。 我还汇编了来自各种来源不同的8,899名ImageMso名单。 我希望其他人能发现这很有用。
微软Office图标(ImageMSO)画廊及提取
我已经结束了一个C#实用工具类提取的Office2007画廊图标.png文件,同时适当保持其透明度。 主要代码是由安德鲁白教堂(写一大篇拍摄http://blogs.msdn.com/b/andreww/archive/2007/10/10/preserving-the-alpha-channel-when-converting-images。 ASPX )。 我已经与Office 2007的样品图标片集成了这个,如果你想将所有的这些图标解压到目标文件夹。
步骤如下:
1)下载Office画廊电子表格在http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=11675
2)要在其中提取的图标调用OfficeIcons.ExtractAllIcons()与Office2007IconsGallery.xlsm示例电子表格的位置,目标文件夹。
{码}
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
using System.Xml.Linq;
using ExcelDna.Integration;
using ICSharpCode.SharpZipLib.Zip;
using Microsoft.Office.Interop.Excel;
using stdole;
public class OfficeIconUtils
{
public static void ExtractAllIcons(string xlsmPath, string targetFolder)
{
// extract customUI.xml
var zf = new ZipFile(xlsmPath);
var entry = zf.GetEntry("customUI/customUI.xml");
var zipStream = zf.GetInputStream(entry);
XNamespace ns = "http://schemas.microsoft.com/office/2006/01/customui";
var root = XElement.Load(zipStream);
foreach (var gallery in root.Descendants(ns + "gallery"))
{
//create a sub-folder for the gallery
var subFolder = Path.Combine(targetFolder,
gallery.Attribute("label").Value);
var width = int.Parse(gallery.Attribute("itemWidth").Value);
var height = int.Parse(gallery.Attribute("itemHeight").Value);
Directory.CreateDirectory(subFolder);
foreach (var item in gallery.Descendants(ns + "item"))
{
SaveIcon(item.Attribute("imageMso").Value,
subFolder, width, height);
}
}
}
public static void SaveIcon(string msoName, string folder,
int width = 32, int height = 32)
{
ConvertPixelByPixel(
((Application)(ExcelDnaUtil.Application))
.CommandBars.GetImageMso(msoName, width, height))
.Save(Path.Combine(folder, string.Format("{0}.png",
msoName)), ImageFormat.Png);
}
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 Int32 bmType;
public Int32 bmWidth;
public Int32 bmHeight;
public Int32 bmWidthBytes;
public Int16 bmPlanes;
public Int16 bmBitsPixel;
public IntPtr bmBits;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFOHEADER
{
public int biSize;
public int biWidth;
public int biHeight;
public Int16 biPlanes;
public Int16 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);
}
{码}
所有PNG文件可以发现这里这些都是PNG格式了。 良好的编程! (一个很好的ZIP文件也可在这里 )的ZIP压缩文件包含的Excel的图标,所有17个。
当您使用GetImageMso方法,你最终的IPICTURE接口的对象。 该IPICTURE接口访问适合保存在原始格式文件的图标 - 不支持的.ICO,.WMF或.BMP PNG格式。 以下链接解释为什么这是不能直接:
http://msdn.microsoft.com/en-us/library/aa434604.aspx (msoGetImageMso方法) http://msdn.microsoft.com/en-us/library/ms680761%28VS.85%29.aspx (IPICTURE接口) http://msdn.microsoft.com/en-us/library/ms694504%28VS.85%29.aspx (另存为文件的方法)
然而,使用更复杂的方法将产生你想要什么:
http://blogs.msdn.com/mshneer/archive/2007/10/10/preserving-transparency-when-rendering-office-icons.aspx
我曾尝试伊斯梅尔的答案和它的工作很大。 但是我花了一段时间来弄清楚如何使它发挥作用。 我可以共享知识的该位:
该解决方案需要ExcelDna从CodePlex网站: 链接 。
由于我使用Net 4.0
,我不为.zip支持,所以我第一次提取的.xslm文件到一个平面目录结构,然后,我改变了代码直接从文件中读取。 然后在Excel中我称之为ExcelDna扩展方法
=ExtractIcons("Office2207IconsGallery";"folder_where_to_store_icons")
using语句的实用工具类(对我来说):
using System.Xml.Linq;
using System.IO;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Drawing.Imaging;
using Application = Microsoft.Office.Interop.Excel.Application;
using ExcelDna.Integration;
using stdole;
希望这有助于....谢谢伊斯梅尔!