Exemple #1
0
        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());
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        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);
        }