private async Task PrintBitmap(Bitmap bimg, bool dither = true) { if (dither) { logger.Trace("Dithering input bitmap"); bimg = Grayscale.CommonAlgorithms.Y.Apply(bimg); OrderedDithering f = new OrderedDithering(bayer4); bimg = f.Apply(bimg); logger.Debug("Dithered Bitmap"); } bimg = CopyToBpp(bimg); logger.Debug("Converted Bitmap to 1-bit"); int hSzImg = bimg.Height; byte[] iimg = new byte[hSzImg * mmj.Printer.LineWidth]; byte[] img; using (MemoryStream s = new MemoryStream()) { bimg.Save(s, ImageFormat.Bmp); img = s.ToArray(); } logger.Debug("Got bitmap's bytes"); bimg.Dispose(); logger.Debug("Disposed of Bitmap"); int startoffset = img.Length - (hSzImg * mmj.Printer.LineWidth); logger.Debug("Processing bytes with offset " + startoffset); for (int h = 0; h < hSzImg; h++) { for (int w = 0; w < mmj.Printer.LineWidth; w++) { iimg[(mmj.Printer.LineWidth * (hSzImg - 1 - h)) + (mmj.Printer.LineWidth - 1 - w)] = (byte)~ img[startoffset + (mmj.Printer.LineWidth * h) + (mmj.Printer.LineWidth - 1 - w)]; } } logger.Debug($"Have {img.Length} bytes of print data ({mmj.Printer.LineWidth * 8}x{hSzImg}@1bpp)"); await mmj.PrintBytesAsync(iimg, false); }