using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using static Matrix_App.Defaults; namespace Matrix_App { public static class Utils { /// /// Resizes and image to the specified size in pixels. /// Sclaing is done via an Bicubic filter. /// Upscaling will result in blurry images. /// /// /// /// /// public static Bitmap ResizeImage(Image image, int width, int height) { var destRect = new Rectangle(0, 0, width, height); var destImage = new Bitmap(width, height); destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution); using var graphics = Graphics.FromImage(destImage); graphics.CompositingMode = CompositingMode.SourceCopy; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; using var wrapMode = new ImageAttributes(); wrapMode.SetWrapMode(WrapMode.TileFlipXY); graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode); return destImage; } /// /// Stores every 3-byte tuple from source into dest, by flipping the 0st and 1st byte of each tuple. /// /// /// public static void ColorStore(byte[][] source, byte[][] dest) { for (var f = 0; f < source.Length; f++) { for (var x = 0; x < source[0].Length; x += 3) { dest[f][x + 0] = source[f][x + 0]; dest[f][x + 1] = source[f][x + 1]; dest[f][x + 2] = source[f][x + 2]; } } } /// /// Wraps buffer into a bitmap with width and height /// /// /// /// /// public static Bitmap ImageWrap(byte[] buffer, int width, int height) { var image = new Bitmap(width, height); for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { var index = (x + y * width) * Bpp; image.SetPixel(x, y, Color.FromArgb( buffer[index + 0], buffer[index + 1], buffer[index + 2] )); } } return image; } /// /// Creates an buffer of RGB-bytes and n-frames. /// /// /// /// /// public static byte[][] CreateImageRGB_NT(int width, int height, int frames) { byte[][] bytes = new byte[frames][]; for (var frame = 0; frame < frames; frame++) { bytes[frame] = new byte[width * height * Bpp]; } return bytes; } } }