コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }