Exemplo n.º 1
0
        public object GetDataFromDataBytes(byte[] bytes, ushort[,] prevFrame, int size, int startIndex)
        {
            var rv = new AdvStatusData();

            if (size > 0)
            {
                byte tagValuesCount = bytes[startIndex];
                startIndex++;

                for (int i = 0; i < tagValuesCount; i++)
                {
                    int tagId = bytes[startIndex];
                    AdvTagDefinition tagDef = m_TagDefinitions[tagId];

                    if (tagDef.Type == AdvTagType.UInt8)
                    {
                        byte value = bytes[startIndex + 1];
                        rv.TagValues[tagDef] = value.ToString();

                        startIndex += 2;
                    }
                    else if (tagDef.Type == AdvTagType.UInt16)
                    {
                        byte b1 = bytes[startIndex + 1];
                        byte b2 = bytes[startIndex + 2];
                        ushort value = (ushort)((b2 << 8) + b1);
                        rv.TagValues[tagDef] = value.ToString();

                        startIndex += 3;
                    }
                    else if (tagDef.Type == AdvTagType.UInt32)
                    {
                        byte b1 = bytes[startIndex + 1];
                        byte b2 = bytes[startIndex + 2];
                        byte b3 = bytes[startIndex + 3];
                        byte b4 = bytes[startIndex + 4];

                        uint value = (uint)((b4 << 24) + (b3 << 16) + (b2 << 8) + b1);
                        rv.TagValues[tagDef] = value.ToString();

                        startIndex += 5;
                    }
                    else if (tagDef.Type == AdvTagType.Real)
                    {
                        byte b1 = bytes[startIndex + 1];
                        byte b2 = bytes[startIndex + 2];
                        byte b3 = bytes[startIndex + 3];
                        byte b4 = bytes[startIndex + 4];

                        uint value = (uint)((b4 << 24) + (b3 << 16) + (b2 << 8) + b1);

                        IntToFloatStruct converter = new IntToFloatStruct();
                        converter.UInt32Value = value;
                        float realValue = converter.RealValue;

                        rv.TagValues[tagDef] = realValue.ToString();

                        startIndex += 5;
                    }
                    else if (tagDef.Type == AdvTagType.ULong64)
                    {
                        byte b1 = bytes[startIndex + 1];
                        byte b2 = bytes[startIndex + 2];
                        byte b3 = bytes[startIndex + 3];
                        byte b4 = bytes[startIndex + 4];
                        byte b5 = bytes[startIndex + 5];
                        byte b6 = bytes[startIndex + 6];
                        byte b7 = bytes[startIndex + 7];
                        byte b8 = bytes[startIndex + 8];

                        uint valLo = (uint)((b4 << 24) + (b3 << 16) + (b2 << 8) + b1);
                        uint valHi = (uint)((b8 << 24) + (b7 << 16) + (b6 << 8) + b5);
                        long value = (((long)valHi) << 32) + (long)valLo;
                        rv.TagValues[tagDef] = value.ToString();

                        startIndex += 9;
                    }
                    else if (tagDef.Type == AdvTagType.AnsiString254)
                    {
                        byte len = bytes[startIndex + 1];
                        byte[] tagValuebytes = new byte[len];
                        Array.Copy(bytes, startIndex + 2, tagValuebytes, 0, len);

                        rv.TagValues[tagDef] = Encoding.ASCII.GetString(tagValuebytes);

                        startIndex += 2 + len;
                    }
                    else if (tagDef.Type == AdvTagType.List16AnsiString254)
                    {
                        StringBuilder bld = new StringBuilder();
                        byte count = bytes[startIndex + 1];
                        startIndex += 2;
                        for (int j = 0; j < count; j++)
                        {
                            byte len = bytes[startIndex];
                            byte[] tagValuebytes = new byte[len];
                            Array.Copy(bytes, startIndex + 1, tagValuebytes, 0, len);

                            bld.AppendLine(Encoding.ASCII.GetString(tagValuebytes));

                            startIndex += 1 + len;
                        }

                        rv.TagValues[tagDef] = bld.ToString();
                    }
                }
            }

            return rv;
        }
Exemplo n.º 2
0
        public Bitmap GetFrame(int index)
        {
            if (index < m_AdvFile.NumberOfFrames)
            {
                byte layoutId;
                AdvImageLayout.GetByteMode byteMode;

                m_AdvFile.GetFrameImageSectionHeader(index, out layoutId, out byteMode);

                AdvImageLayout layout = m_ImageSection.GetImageLayoutFromLayoutId(layoutId);

                if (layout.IsDiffCorrLayout && byteMode == AdvImageLayout.GetByteMode.DiffCorrBytes && prevFrameNo != index - 1)
                {
                    // Move back and find the nearest previous key frame
                    int keyFrameIdx = index;
                    do
                    {
                        keyFrameIdx--;
                        m_AdvFile.GetFrameImageSectionHeader(keyFrameIdx, out layoutId, out byteMode);
                    }
                    while (keyFrameIdx > 0 && byteMode != AdvImageLayout.GetByteMode.KeyFrameBytes);

                    object[] keyFrameData = m_AdvFile.GetFrameSectionData(keyFrameIdx, null);

                    prevFramePixels = ((AdvImageData)keyFrameData[0]).ImageData;

                    if (layout.DiffCorrFrame == DiffCorrFrameMode.PrevFrame)
                    {
                        for (int i = keyFrameIdx + 1; i < index; i++)
                        {
                            object[] frameData = m_AdvFile.GetFrameSectionData(i, prevFramePixels);

                            prevFramePixels = ((AdvImageData)frameData[0]).ImageData;

                        }
                    }
                }

                object[] data;

                data = m_AdvFile.GetFrameSectionData(index, prevFramePixels);

                AdvImageData imageData = (AdvImageData)data[0];
                m_FrameStatus = (AdvStatusData)data[1];
                m_MidExposureUtc = imageData.MidExposureUtc;
                m_Exposure = imageData.ExposureMilliseconds;

                if (prevFramePixels == null)
                    prevFramePixels = new ushort[m_ImageSection.Width, m_ImageSection.Height];

                for (int x = 0; x < m_ImageSection.Width; x++)
                    for (int y = 0; y < m_ImageSection.Height; y++)
                    {
                        prevFramePixels[x, y] = imageData.ImageData[x, y];
                    }

                prevFrameNo = index;

                Bitmap rv = m_ImageSection.CreateBitmap(imageData);

                return rv;
            }
            else
                return null;
        }