static byte[] convert16ARGBTo32ARGB(StciData RGBData) { byte[] RGB = RGBData.imageData; Int32 ARGBLength = RGB.Length * 2; List <byte> ARGB = new List <byte>(); UInt16 blueMask = (UInt16)RGBData._RGB.uiBlueMask; UInt16 greenMask = (UInt16)RGBData._RGB.uiGreenMask; UInt16 redMask = (UInt16)RGBData._RGB.uiRedMask; UInt16 alphaMask = (UInt16)RGBData._RGB.uiAlphaMask; byte blueDepth = RGBData._RGB.ubBlueDepth; byte greenDepth = RGBData._RGB.ubGreenDepth; byte redDepth = RGBData._RGB.ubRedDepth; byte alphaDepth = RGBData._RGB.ubAlphaDepth; using (BinaryReader br = new BinaryReader(new MemoryStream(RGB))) { while (ARGB.Count < ARGBLength) { UInt16 word = br.ReadUInt16(); // Такой способ декодирования должен работать для форматов // Format16bppArgb1555, Format16bppRgb555, Format16bppRgb565 ARGB.Add((byte)((word & blueMask) << (8 - blueDepth))); ARGB.Add((byte)((word & greenMask) >> (8 - redDepth - alphaDepth))); ARGB.Add((byte)((word & redMask) >> (8 - alphaDepth))); ARGB.Add((byte)((word & alphaMask) >> 8)); } } return(ARGB.ToArray()); }
public static ExtendedBitmap GetBitmap(StciData RGBData) { byte[] argbFile = convert16ARGBTo32ARGB(RGBData); List <byte> bmpFile = new List <byte>(); bmpFile.AddRange(BMP.CreateBmpHeader ( (UInt32)argbFile.Length, (UInt32)RGBData.Width, (UInt32)RGBData.Height, (UInt16)32, (UInt32)0 )); bmpFile.AddRange(argbFile); using (MemoryStream argbStream = new MemoryStream(bmpFile.ToArray())) { Bitmap bm; try { bm = new Bitmap(argbStream); } catch { bm = new Bitmap(RGBData.Width, RGBData.Height); } bm.RotateFlip(RotateFlipType.Rotate180FlipX); return(new ExtendedBitmap(bm, RGBData._RGB)); //, (UInt16)RGBData.Height, (UInt16)RGBData.Width); } }
public static ETRLEData LoadIndexedImageData(StciData data) { UInt32 uiFileSectionSize; UInt32 fContents = IMAGE_ALLDATA; //IMAGE_ALLIMAGEDATA; UInt32 numberOfColours = data._Indexed.UiNumberOfColours; UInt32 numberOfSubImages = data._Indexed.UsNumberOfSubImages; byte[] imageData = data.imageData; // Color[] palette = new Color[numberOfColours]; byte[] palette = new byte[numberOfColours * 4]; ETRLEData result = new ETRLEData(palette); using (BinaryReader dataReader = new BinaryReader(new MemoryStream(imageData, 0, imageData.Length))) { if ((fContents & IMAGE_PALETTE) != 0) { // Allocate memory for reading in the palette uiFileSectionSize = numberOfColours * STCI_PALETTE_ELEMENT_SIZE; for (Int32 i = 0; i < numberOfColours; i++) { palette[i * 4 + 3] = 0; byte b = dataReader.ReadByte(); palette[i * 4 + 2] = b; //if (IndexedConverter.GlobalPalette[i * 3 + 2] == 0) // IndexedConverter.GlobalPalette[i * 3 + 2] = b; b = dataReader.ReadByte(); palette[i * 4 + 1] = b; //if (IndexedConverter.GlobalPalette[i * 3 + 1] == 0) // IndexedConverter.GlobalPalette[i * 3 + 1] = b; b = dataReader.ReadByte(); palette[i * 4 + 0] = b; //if (IndexedConverter.GlobalPalette[i * 3 + 0] == 0) // IndexedConverter.GlobalPalette[i * 3 + 0] = b; // Color.FromArgb(dataReader.ReadByte(), dataReader.ReadByte(), dataReader.ReadByte()); } //hImage->fFlags |= IMAGE_PALETTE; } if ((fContents & IMAGE_BITMAPDATA) != 0) { if ((data.FFlags & STCI_ETRLE_COMPRESSED) != 0) { result.Compressed = true; // load data for the subimage (object) structures result.usNumberOfObjects = (UInt16)numberOfSubImages; uiFileSectionSize = numberOfSubImages * STCI_SUBIMAGE_SIZE; ETRLEObject[] objects = new ETRLEObject[numberOfSubImages]; for (Int32 i = 0; i < numberOfSubImages; i++) { objects[i] = new ETRLEObject ( dataReader.ReadUInt32(), dataReader.ReadUInt32(), dataReader.ReadInt16(), dataReader.ReadInt16(), dataReader.ReadUInt16(), dataReader.ReadUInt16() ); } result.uiSizePixData = data.UiStoredSize; result.ETRLEObjects = objects; // hImage->fFlags |= IMAGE_TRLECOMPRESSED; } result.imageData = dataReader.ReadBytes((Int32)data.UiStoredSize); // hImage->fFlags |= IMAGE_BITMAPDATA; } else if ((fContents & IMAGE_APPDATA) != 0) // then there's a point in seeking ahead { dataReader.BaseStream.Seek(data.UiStoredSize, SeekOrigin.Current); } if ((fContents & IMAGE_APPDATA) != 0 && data.UiAppDataSize > 0) { // load application-specific data result.pAppData = dataReader.ReadBytes((Int32)data.UiAppDataSize); result.uiAppDataSize = data.UiAppDataSize; // hImage->fFlags |= IMAGE_APPDATA; } else { result.pAppData = null; result.uiAppDataSize = 0; } } result.HeaderData = data; return(result); }