private static byte[] FinalizeBitmap(IcoFrame source, BitmapEncoding encoding, Dialect dialect, ByteWriter writer, uint offsetToData, uint offsetToImageSize) { var offsetToEndOfData = writer.SeekOffset; if (dialect == Dialect.Ico) { var padding = writer.Data.Count % 4; var inferMaskFromAlpha = (source.Encoding.PixelFormat == BitmapEncoding.Pixel_argb32 && encoding != BitmapEncoding.Pixel_argb32); for (var y = source.CookedData.Height - 1; y >= 0; y--) { var bits = new BitWriter(writer); for (var x = 0; x < source.CookedData.Width; x++) { var mask = inferMaskFromAlpha ? (source.CookedData[x, y].A == 0) : source.Mask[x, y]; bits.AddBit1((byte)(mask ? 1 : 0)); } while ((writer.Data.Count % 4) != padding) { writer.AddUint8(0); } } } if (dialect != Dialect.Ico) { writer.SeekOffset = 2; writer.AddUint32((uint)writer.Data.Count); writer.SeekOffset = 10; writer.AddUint32(offsetToData); } writer.SeekOffset = (int)offsetToImageSize; writer.AddUint32((uint)(offsetToEndOfData - offsetToData)); // biSizeImage return(writer.Data.ToArray()); }