/// <summary> /// Converts <see cref="NDArray"/> to a <see cref="Bitmap"/>. /// </summary> /// <param name="nd">The <see cref="NDArray"/> to copy pixels from, <see cref="Shape"/> is ignored completely. If nd.Unsafe.Shape.IsContiguous == false then a copy is made.</param> /// <param name="width">The height of the <see cref="Bitmap"/></param> /// <param name="height">The width of the <see cref="Bitmap"/></param> /// <returns>A <see cref="Bitmap"/></returns> /// <exception cref="ArgumentException">When nd.size != width*height, which means the ndarray be turned into the given bitmap size.</exception> public static unsafe Bitmap ToBitmap(this NDArray nd, int width, int height) { if (nd == null) { throw new ArgumentNullException(nameof(nd)); } if (width * height != nd.size) { throw new ArgumentException("Given nd.size != width*height"); } if (!nd.Unsafe.Shape.IsContiguous) { nd = nd.Clone(); } var ret = new Bitmap(height, width); var bitdata = ret.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); try { nd.CopyTo(new UnmanagedMemoryBlock <byte>((byte *)bitdata.Scan0, bitdata.Stride * bitdata.Height)); } finally { ret.UnlockBits(bitdata); } return(ret); }