public byte[] GetResDirectoryData() { // recreate the Icon Directory resource data var ms = new MemoryStream(); var wtr = new BinaryWriter(ms); var dir = new IconDirectory { wReserved = 0, wType = (ushort)(Type == IconType.Icon ? 1u : 2u), wCount = (ushort)_images.Count }; dir.Write(wtr); foreach (var directoryMember in _images) { var image = (IconImage)directoryMember; var entry = new ResIconDirectoryEntry { bWidth = (byte)image.Size.Width, bHeight = (byte)image.Size.Height, bColorCount = image.ColorCount, bReserved = 0, wPlanes = image.Planes, wBitCount = image.BitCount, dwBytesInRes = (uint)image.ImageData.Length, wId = (ushort)image.ResourceData.Lang.Name.Identifier.NativeId.ToInt32() }; // gotta love the load of dereferencing going on here entry.Write(wtr); } return(ms.ToArray()); }
public Byte[] GetResDirectoryData() { // recreate the Icon Directory resource data MemoryStream ms = new MemoryStream(); BinaryWriter wtr = new BinaryWriter(ms); IconDirectory dir = new IconDirectory(); dir.wReserved = 0; dir.wType = (ushort)(Type == IconType.Icon ? 1u : 2u); dir.wCount = (ushort)_images.Count; dir.Write(wtr); foreach (IconImage image in _images) { ResIconDirectoryEntry entry = new ResIconDirectoryEntry(); entry.bWidth = (byte)image.Size.Width; entry.bHeight = (byte)image.Size.Height; entry.bColorCount = image.ColorCount; entry.bReserved = 0; entry.wPlanes = image.Planes; entry.wBitCount = image.BitCount; entry.dwBytesInRes = (uint)image.ImageData.Length; entry.wId = (ushort)image.ResourceData.Lang.Name.Identifier.NativeId.ToInt32(); // gotta love the load of dereferencing going on here entry.Write(wtr); } return(ms.ToArray()); }
/// <summary>Saves as an ICO to the specified Stream</summary> public void Save(Stream stream) { BinaryWriter wtr = new BinaryWriter(stream); IconDirectory dir = new IconDirectory(); dir.wReserved = 0; dir.wType = (ushort)(Type == IconType.Icon ? 1u : 2u); dir.wCount = (ushort)_images.Count; dir.Write(wtr); ////////////////////////////////// _images.Sort(); // Calculate offsets UInt32 offsetSoFar = (uint)(IconDirectory.Size + _images.Count * FileIconDirectoryEntry.Size); UInt32[] offsets = new UInt32[_images.Count]; for (int i = 0; i < _images.Count; i++) { offsets[i] = offsetSoFar; offsetSoFar += (uint)(_images[i] as IconImage).ImageData.Length; if (Type == IconType.Cursor) { offsetSoFar -= 4; } } ////////////////////////////////// for (int i = 0; i < _images.Count; i++) { IconImage image = _images[i] as IconImage; FileIconDirectoryEntry entry = new FileIconDirectoryEntry(); entry.bWidth = (byte)image.Size.Width; entry.bHeight = (byte)image.Size.Height; entry.bColorCount = image.ColorCount; entry.bReserved = 0; if (Type == IconType.Icon) { entry.wPlanes = image.Planes; entry.wBitCount = image.BitCount; entry.dwBytesInRes = (uint)image.ImageData.Length; } else if (Type == IconType.Cursor) { entry.wXHotspot = (ushort)image.Hotspot.X; entry.wYHotspot = (ushort)image.Hotspot.Y; entry.dwBytesInRes = (uint)image.ImageData.Length - 4; } entry.dwImageOffset = offsets[i]; entry.Write(wtr); } ////////////////////////////////// for (int i = 0; i < _images.Count; i++) { IconImage image = _images[i] as IconImage; if (Type == IconType.Icon) { wtr.Write(image.ImageData); } else if (Type == IconType.Cursor) { // the first 4 bytes (2 words) of a cursor's image data are discarded wtr.Write(image.ImageData, 4, image.ImageData.Length - 4); } } }