예제 #1
0
        private static void MoveBezierPoint(PointF p0, ref PointF p1, ref PointF p2, PointF p3,
                                            PointF pNew, bool isBeginMove)
        {
            PointF    fixPoint    = isBeginMove ? p3 : p0;
            PointF    movePoint   = isBeginMove ? p0 : p3;
            PolarData originPolar = new PolarData(fixPoint, movePoint);
            PolarData modifyPolar = new PolarData(fixPoint, pNew);

            float rate      = modifyPolar.Length / originPolar.Length;
            float radianOff = modifyPolar.Radian - originPolar.Radian;

            PolarData polar1 = new PolarData(fixPoint, p1);

            polar1.Offset(rate, radianOff);
            p1 = polar1.GetPointF(fixPoint);
            PolarData polar2 = new PolarData(fixPoint, p2);

            polar2.Offset(rate, radianOff);
            p2 = polar2.GetPointF(fixPoint);
        }
예제 #2
0
        /// <summary>
        /// Сохраняет VimbaAPI Frame в *.Tiff файл
        /// </summary>
        /// <param name="frame">Vimba's Frame</param>
        /// <param name="filename">Имя файла</param>
        /// <param name="tiffWorker"></param>
        public static void SavePolarisationFrameToTiff(Frame frame, string filename, TiffWorker tiffWorker)
        {
            Tiff.SetTagExtender(TagExtender); //parentExtender = Tiff.SetTagExtender(TagExtender);
            using (var tiff = Tiff.Open(filename, "w"))
            {
                tiff.SetField(TiffTag.IMAGEWIDTH, frame.Width);
                tiff.SetField(TiffTag.IMAGELENGTH, frame.Height);
                tiff.SetField(TiffTag.SAMPLESPERPIXEL, 1);
                tiff.SetField(TiffTag.BITSPERSAMPLE, 16);
                tiff.SetField(TiffTag.ROWSPERSTRIP, frame.Height);
                tiff.SetField(TiffTag.FILLORDER, FillOrder.MSB2LSB);
                tiff.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISBLACK);

                //Set custom tags:

                tiff.SetField(TIFFTAG_WAVELENGTH_METADATA, tiffWorker.Wavelength);
                tiff.SetField(TIFFTAG_EXPOSURE_METADATA, tiffWorker.Exposure);
                tiff.SetField(TIFFTAG_GAIN_METADATA, tiffWorker.Gain);
                tiff.SetField(TIFFTAG_GAMMA_METADATA, tiffWorker.Gamma);
                tiff.SetField(TIFFTAG_TIMESTAMP_METADATA, tiffWorker.Timestamp);
                tiff.SetField(TIFFTAG_GPS_METADATA, tiffWorker.GPS);
                tiff.SetField(TIFFTAG_OffsetX_METADATA, tiffWorker.OffsetX);
                tiff.SetField(TIFFTAG_OffsetY_METADATA, tiffWorker.OffsetY);
                tiff.SetField(TIFFTAG_BinningX_METADATA, tiffWorker.BinningX);
                tiff.SetField(TIFFTAG_BinningY_METADATA, tiffWorker.BinningY);
                tiff.SetField(TIFFTAG_WAVENUMBER_METADATA, tiffWorker.Wavenumber);
                tiff.SetField(TIFFTAG_BITS_METADATA, tiffWorker.Bits);

                //Main Page
                tiff.SetField(TiffTag.SUBFILETYPE, FileType.PAGE);
                tiff.SetField(TiffTag.PAGENAME, "Full");
                tiff.SetField(TiffTag.PAGENUMBER, 0, 5);

                int    rawLength = (int)frame.Width * 2; //длина ряда 16-битных пикселей в байтах
                byte[] buffer    = new byte[rawLength];
                int    srcOffset = 0;

                for (int j = 0; j < frame.Height; j++)
                {
                    srcOffset = rawLength * j;                                           //offset in source buffer в байтах

                    Buffer.BlockCopy(frame.Buffer, srcOffset, buffer, 0, buffer.Length); //заполняем буффер ряда

                    tiff.WriteScanline(buffer, j);                                       //записываем ряд j в файл
                }
                tiff.WriteDirectory();

                //Write Polarisation Components pages
                int w = (int)frame.Width / 2;
                int h = (int)frame.Height / 2;
                rawLength = (int)frame.Width;
                buffer    = new byte[rawLength];

                PolarData[] polars = new PolarData[] { PolarData.I0, PolarData.I135, PolarData.I45, PolarData.I90 };
                byte[]      I      = null;

                for (int k = 0; k < polars.Length; k++)
                {
                    tiff.SetField(TiffTag.IMAGEWIDTH, w);
                    tiff.SetField(TiffTag.IMAGELENGTH, h);
                    tiff.SetField(TiffTag.SAMPLESPERPIXEL, 1);
                    tiff.SetField(TiffTag.BITSPERSAMPLE, 16);
                    tiff.SetField(TiffTag.ROWSPERSTRIP, h);
                    tiff.SetField(TiffTag.FILLORDER, FillOrder.MSB2LSB);
                    tiff.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISBLACK);
                    tiff.SetField(TiffTag.SUBFILETYPE, FileType.PAGE);
                    tiff.SetField(TiffTag.PAGENAME, polars[k].ToString());
                    tiff.SetField(TiffTag.PAGENUMBER, k + 1, 5);

                    I = ExtractPolarisation(frame, polars[k], tiffWorker.Bits);

                    for (int j = 0; j < h; j++)
                    {
                        srcOffset = rawLength * j;

                        Buffer.BlockCopy(I, srcOffset, buffer, 0, buffer.Length);

                        tiff.WriteScanline(buffer, j);
                    }
                    tiff.WriteDirectory();
                }

                tiff.Close();
                tiff.Dispose();
            }
            //Tiff.SetTagExtender(parentExtender);
        }
예제 #3
0
 /// <summary>Позволяет получить битмап группы пикселей с определенным направлением поляризатора</summary>
 /// <param name="frame">Исходный буффер</param>
 /// <param name="polarisation">Ориентация поляризатора I0, I45, I90, I135</param>
 /// <param name="bits">Глубина цвета</param>
 /// <returns></returns>
 public static Bitmap ExtractPolarisationBitmap(Frame frame, PolarData polarisation, int bits)
 {
     return(ExtractPolarisationBitmap(frame.Buffer, (int)frame.Width, (int)frame.Height, polarisation, bits));
 }
예제 #4
0
        /// <summary>Позволяет получить битмап группы пикселей с определенным направлением поляризатора</summary>
        /// <param name="frameBuffer">Буффер байтов кадра</param>
        /// <param name="frameWidth">Ширина исходного кадра</param>
        /// <param name="frameHeight">Высота исходного кадра</param>
        /// <param name="polarisation">Какую компоненту поляризации выделить</param>
        /// <param name="bits">Сколько бит на пиксель</param>
        /// <returns></returns>
        public static Bitmap ExtractPolarisationBitmap(byte[] frameBuffer, int frameWidth, int frameHeight, PolarData polarisation, int bits)
        {
            int w      = frameWidth / 2;
            int h      = frameHeight / 2;
            int maxval = Convert.ToInt32(Math.Pow(2, bits)) - 1;

            Bitmap     resBitmap = new Bitmap(w, h, PixelFormat.Format32bppRgb);
            BitmapData bd        = resBitmap.LockBits(new Rectangle(0, 0, resBitmap.Width, resBitmap.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppRgb);

            unsafe
            {
                byte b = 0;
                fixed(byte *src = frameBuffer)
                {
                    byte *result = (byte *)bd.Scan0;

                    if (bits > 8)
                    {
                        short *source = (short *)src;
                        if (polarisation == PolarData.I135 || polarisation == PolarData.I90)
                        {
                            source += 1;
                        }
                        if (polarisation == PolarData.I45 || polarisation == PolarData.I90)
                        {
                            source += frameWidth;
                        }

                        for (int j = 0; j < frameHeight; j += 2)
                        {
                            for (int i = 0; i < frameWidth; i += 2)
                            {
                                b         = (byte)(source[i] * 255 / maxval);
                                result[0] = result[1] = result[2] = b;
                                result   += 4;
                            }
                            source += 2 * frameWidth;
                        }
                    }
                    if (bits == 8)
                    {
                        byte *source = src;
                        if (polarisation == PolarData.I135 || polarisation == PolarData.I90)
                        {
                            source += 1;
                        }
                        if (polarisation == PolarData.I45 || polarisation == PolarData.I90)
                        {
                            source += frameWidth;
                        }

                        for (int j = 0; j < frameHeight; j += 2)
                        {
                            for (int i = 0; i < frameWidth; i += 2)
                            {
                                result[0] = result[1] = result[2] = source[i];
                                result   += 4;
                            }
                            source += 2 * frameWidth;
                        }
                    }
                }
            }
            resBitmap.UnlockBits(bd);
            return(resBitmap);
        }
예제 #5
0
        public static byte[] ExtractPolarisation(Frame frame, PolarData polarisation, int bits)
        {
            int w = (int)frame.Width / 2;
            int h = (int)frame.Height / 2;

            byte[] resultBuffer = null;

            unsafe
            {
                if (bits == 8)
                {
                    resultBuffer = new byte[w * h];
                }
                if (bits > 8)
                {
                    resultBuffer = new byte[2 * w * h];
                }

                if (bits > 8)
                {
                    fixed(byte *res = resultBuffer, src = frame.Buffer)
                    {
                        if (bits > 8)
                        {
                            short *result = (short *)res;
                            short *source = (short *)src;
                            if (polarisation == PolarData.I135 || polarisation == PolarData.I90)
                            {
                                source += 1;
                            }
                            if (polarisation == PolarData.I45 || polarisation == PolarData.I90)
                            {
                                source += frame.Width;
                            }

                            for (int j = 0; j < frame.Height; j += 2)
                            {
                                for (int i = 0; i < frame.Width; i += 2)
                                {
                                    result[0] = source[i];
                                    result++;
                                }
                                source += 2 * frame.Width;
                            }
                        }
                        if (bits == 8)
                        {
                            byte *result = res;
                            byte *source = src;
                            if (polarisation == PolarData.I135 || polarisation == PolarData.I90)
                            {
                                source += 1;
                            }
                            if (polarisation == PolarData.I45 || polarisation == PolarData.I90)
                            {
                                source += frame.Width;
                            }

                            for (int j = 0; j < frame.Height; j += 2)
                            {
                                for (int i = 0; i < frame.Width; i += 2)
                                {
                                    result[0] = source[i];
                                    result++;
                                }
                                source += 2 * frame.Width;
                            }
                        }
                    }
                }
            }

            return(resultBuffer);
        }