private static List <IcImage> GetImages(Icon ico) { List <IcImage> l = new List <IcImage>(); byte[] pb; using (MemoryStream ms = new MemoryStream()) { ico.Save(ms); pb = ms.ToArray(); } const int cbDir = NativeMethods.ICONDIRSize; if (Marshal.SizeOf(typeof(ICONDIR)) != cbDir) { Debug.Assert(false); return(l); } const int cbEntry = NativeMethods.ICONDIRENTRYSize; if (Marshal.SizeOf(typeof(ICONDIRENTRY)) != cbEntry) { Debug.Assert(false); return(l); } int iPos = 0; ICONDIR d = MemUtil.BytesToStruct <ICONDIR>(pb, iPos); iPos += cbDir; if (d.idReserved != 0) { Debug.Assert(false); return(l); } if (d.idType != 1) { Debug.Assert(false); return(l); } for (uint u = 0; u < d.idCount; ++u) { IcImage img = new IcImage(); img.Entry = MemUtil.BytesToStruct <ICONDIRENTRY>(pb, iPos); iPos += cbEntry; img.Data = MemUtil.Mid(pb, (int)img.Entry.dwImageOffset, (int)img.Entry.dwBytesInRes); l.Add(img); } #if DEBUG int cbSum = cbDir + (l.Count * cbEntry); foreach (IcImage img in l) { cbSum += img.Data.Length; } Debug.Assert(cbSum == pb.Length); // No extra data #endif return(l); }
private static Icon CreateIcon(List <IcImage> l) { int n = l.Count; if ((n <= 0) || (n > ushort.MaxValue)) { Debug.Assert(false); return(null); } const int cbDir = NativeMethods.ICONDIRSize; if (Marshal.SizeOf(typeof(ICONDIR)) != cbDir) { Debug.Assert(false); return(null); } const int cbEntry = NativeMethods.ICONDIRENTRYSize; if (Marshal.SizeOf(typeof(ICONDIRENTRY)) != cbEntry) { Debug.Assert(false); return(null); } int iData = cbDir + (n * cbEntry); for (int i = 0; i < n; ++i) { int cb = l[i].Data.Length; Debug.Assert(l[i].Entry.dwBytesInRes == cb); l[i].Entry.dwBytesInRes = (uint)cb; l[i].Entry.dwImageOffset = (uint)iData; iData += cb; } byte[] pbIco; using (MemoryStream ms = new MemoryStream(iData)) { ICONDIR d = new ICONDIR(); d.idType = 1; d.idCount = (ushort)n; byte[] pb = MemUtil.StructToBytes <ICONDIR>(ref d); Debug.Assert(pb.Length == cbDir); MemUtil.Write(ms, pb); for (int i = 0; i < n; ++i) { ICONDIRENTRY e = l[i].Entry; pb = MemUtil.StructToBytes <ICONDIRENTRY>(ref e); Debug.Assert(pb.Length == cbEntry); MemUtil.Write(ms, pb); } for (int i = 0; i < n; ++i) { MemUtil.Write(ms, l[i].Data); } pbIco = ms.ToArray(); } Debug.Assert(pbIco.Length == iData); Icon ico; using (MemoryStream msRead = new MemoryStream(pbIco, false)) { ico = new Icon(msRead); } return(ico); }