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); }
/// <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); }
/// <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)); }
/// <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); }
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); }