public static void FillGrayBitmap(this Bitmap bitmap, IMatrixLayer layer) { BitmapData bitmapData = bitmap.LockBits(new Rectangle(Point.Empty, bitmap.Size), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); IntPtr intPtr = bitmapData.Scan0; int stride = bitmapData.Stride; int bytes = Math.Abs(stride) * bitmap.Height; byte[] vs;// = new byte[bytes]; // Bitmap storage MatrixLayer <byte> byteLayer = layer.ToByteLayer(false); vs = byteLayer.GetStorage(false); if (bitmap.Width == stride) { System.Runtime.InteropServices.Marshal.Copy(vs, 0, intPtr, vs.Length); } else { int offsetArr = 0; int offsetPtr = 0; for (int i = 0; i < bitmap.Height; i++) { System.Runtime.InteropServices.Marshal.Copy(vs, offsetArr, (intPtr + offsetPtr), layer.Width); offsetArr += layer.Width; offsetPtr += stride; } } bitmap.UnlockBits(bitmapData); }
public static Mat GetCVMat(this IMatrixLayer layer) { //var method = // typeof(ImageExtensions).GetMethod(nameof(GetCVMat), 1, new Type[] { typeof(MatrixLayer<>) }) // .MakeGenericMethod(layer.ElementType); var method = Info.OfMethod("OpenCVSupport", "OpenCVSupport.ImageExtensions", "GetCVMat", "MatrixLayer`1"); method = method.MakeGenericMethod(layer.ElementType); return((Mat)method.Invoke(null, new object[] { layer })); }
public static void SetCVMat(this IMatrixLayer layer, Mat mat) { //var method = // typeof(ImageExtensions).GetMethod(nameof(SetCVMat), 1, new Type[] { typeof(MatrixLayer<>) }) // .MakeGenericMethod(layer.ElementType); var method = Info.OfMethod("OpenCVSupport", "OpenCVSupport.ImageExtensions", "SetCVMat", "MatrixLayer`1,Mat"); method = method.MakeGenericMethod(layer.ElementType); method.Invoke(null, new object[] { layer, mat }); }
public static void FillGrayBitmap(this Bitmap bitmap, IMatrixLayer layer) { BitmapData bitmapData = bitmap.LockBits(new Rectangle(Point.Empty, bitmap.Size), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); IntPtr intPtr = bitmapData.Scan0; int stride = bitmapData.Stride; int bytes = Math.Abs(stride) * bitmap.Height; byte[] vs;// = new byte[bytes]; // Bitmap storage MatrixLayer <byte> byteLayer = layer.ToByteLayer(false); vs = byteLayer.GetStorage(false); System.Runtime.InteropServices.Marshal.Copy(vs, 0, intPtr, bytes); bitmap.UnlockBits(bitmapData); }
/// <summary> /// /// </summary> /// <param name="layers"> /// В зависимости от типа <see cref="Array"/> /// <list type="bullet"> /// <item><term>Двумерный массив простых чисел T[,]</term> вернет однослойное изображение</item> /// <item><term>Массив двумерных массивов простых чисел T[][,]</term> вернет многослойное изображение</item> /// <item><term>Массив слоев IMatrixLayer[]</term> вернет изображение, состоящее из данных слоев без копирования</item> /// </list> /// </param> /// <returns></returns> public static IMatrixImage CreateImage(Array layers) { var elementType = layers.GetType().GetElementType(); if (elementType.IsValueType) { if (layers.Rank == 2) { // layers is ?[,] IMatrixLayer layer = MatrixLayerBuilder.CreateLayer(layers); layers = Array.CreateInstance(typeof(MatrixLayer <>).MakeGenericType(layer.ElementType), 1); layers.SetValue(layer, 0); return((IMatrixImage)Activator.CreateInstance(typeof(MatrixImage <>).MakeGenericType(layer.ElementType), layers, false)); } } else if (elementType.IsArray) { elementType = elementType.GetElementType(); if (elementType.GetArrayRank() == 2 && (typeof(IMatrixLayer).IsAssignableFrom(elementType))) { Array[] subarrays = (Array[])layers; layers = Array.CreateInstance(elementType.GetElementType(), subarrays.Length); for (int i = 0; i < subarrays.Length; i++) { layers.SetValue(MatrixLayerBuilder.CreateLayer(layers), i); } return((IMatrixImage)Activator.CreateInstance(typeof(MatrixImage <>).MakeGenericType(elementType), layers)); } } if (typeof(IMatrixLayer) == elementType) { return(CreateImage((IMatrixLayer[])layers, false)); } if (typeof(IMatrixLayer).IsAssignableFrom(elementType)) { // layers is MatrixLayer<?>[] return((IMatrixImage)Activator.CreateInstance(typeof(MatrixImage <>).MakeGenericType(elementType.GenericTypeArguments[0]), layers, false)); } return((IMatrixImage)Activator.CreateInstance(typeof(MatrixImage <>).MakeGenericType(elementType), layers)); }
public static LineSeries CreateLineSeries(IMatrixLayer layer, OxyColor?color = null, string title = null) { LineSeries ls = new LineSeries(); if (color.HasValue) { ls.Color = color.Value; } if (title != null) { ls.Title = title; } MatrixLayer <byte> byteLayer = layer.ToByteLayer(false); int[] values = new int[256]; byteLayer.ForEachPixels(a => values[a]++); for (int i = 0; i < 256; i++) { ls.Points.Add(new DataPoint(i, values[i])); } return(ls); }