public static void FromFile(Stream stream, UInt16 lang, ResourceSource source, ResIconDir resDir) { if (stream.Length < Marshal.SizeOf(typeof(IconDirectory))) { return; } BinaryReader rdr = new BinaryReader(stream); IconDirectory?tDir = ReadIcoHeader(rdr); if (tDir == null) { return; } IconDirectory dir = tDir.Value; /////////////////////////////// // rdr is now at the beginning of the array of FileIconDirectoryMembers FileIconDirectoryEntry[] subImages = new FileIconDirectoryEntry[dir.wCount]; for (int i = 0; i < dir.wCount; i++) { subImages[i] = ReadFileDirMember(rdr); } ///////////////////////////// // now for image data itself IconImageResourceDataFactory factory = GetIconImageFactory(); for (int i = 0; i < dir.wCount; i++) { FileIconDirectoryEntry img = subImages[i]; stream.Seek(img.dwImageOffset, SeekOrigin.Begin); Byte[] data = new Byte[img.dwBytesInRes]; stream.Read(data, 0, (int)img.dwBytesInRes); Size dimensions = new Size(img.bWidth == 0 ? 256 : img.bWidth, img.bHeight == 0 ? 256 : img.bHeight); IconCursorImageResourceData memberImageData = factory.FromResource(null, data) as IconCursorImageResourceData; IconDirectoryMember member = new IconDirectoryMember(memberImageData, dimensions, img.bColorCount, img.bReserved, img.wPlanes, img.wBitCount, img.dwBytesInRes); resDir.AddUpdateMemberImage(member); } }
private static IconImageResourceDataFactory GetIconImageFactory() { if (_factory != null) { return(_factory); } ResourceTypeIdentifier typeId = new ResourceTypeIdentifier(new IntPtr((int)Win32ResourceType.IconImage)); ResourceDataFactory[] factories = ResourceDataFactory.GetFactoriesForType(typeId); foreach (ResourceDataFactory f in factories) { IconImageResourceDataFactory iif = f as IconImageResourceDataFactory; if (iif != null) { return(_factory = iif); } } return(_factory); }