Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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 }));
        }
Esempio n. 3
0
        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 });
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        /// <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);
        }