public virtual void Encode(IRgb24BitmapBase bitmap, Stream stream) { if (bitmap == null) { throw new ArgumentNullException(nameof(bitmap)); } if (stream == null) { throw new ArgumentNullException(nameof(stream)); } WriteHeader(stream); var context = new GifEncodingContext(bitmap, stream); context.Data = bitmap.GetPixels(); context.Colors = context.Data.Distinct().ToArray(); WriteLogicalScreenDescriptor(context); // Global color map WriteColorTable(context); WriteImageDescriptor(context); // Local color table: empty WriteImageData(context); // Trailer stream.WriteByte(0x3B); }
public override IImage Create(string data, IRgb24BitmapBase image, IRgb24BitmapBase imageText) { var bitmap = image as IRgb24Bitmap; if (bitmap?.FrameCount > 1) { var bitMatrix = QRCodeEncoder.Build(data); int moduleCount = bitMatrix.Size; var images = Enumerable.Range(0, bitmap.FrameCount).Select(i => { var imgBitMatrix = Binarizer.Binarize(image, moduleCount * 3, moduleCount * 3); //var imgColorMatrix = Colorizer.Colorize(image, moduleCount * 3, moduleCount * 3); var imgColorMatrix = new ColorSquare(moduleCount * 3); var imgMatrix = Binarizer.Binarize(bitmap.GetFrame(i), moduleCount * 3, moduleCount * 3); var frameMatrix = Merger.Merge(bitMatrix, QRCodeEncoder.TypeNumber, imgBitMatrix); return(BitMatrixDrawer.Draw(frameMatrix, imgColorMatrix)); }).ToList(); if (FrameMerger == null) { return(images[0]); } var frames = images.Select(img => img as IRgb24BitmapFrame).ToList(); if (frames.Contains(null)) { return(images[0]); } return(FrameMerger(frames)); } else { return(base.Create(data, image, imageText)); } }
private static bool CheckImagePath(string imagePath, out IRgb24BitmapBase bitmap) { if (imagePath == null) { bitmap = null; return(true); } if (!File.Exists(imagePath)) { LogError("File not found."); bitmap = null; return(false); } try { var bmp = Bitmap.FromFile(imagePath) as Bitmap; bitmap = new BitmapFrame(bmp); return(true); } catch (Exception ex) { LogError(ex.Message); bitmap = null; return(false); } }
public virtual IImage Create(string data, IRgb24BitmapBase image) { var bitMatrix = QRCodeEncoder.Build(data); if (image != null) { int moduleCount = bitMatrix.Size; var imgMatrix = Binarizer.Binarize(image, moduleCount * 3, moduleCount * 3); bitMatrix = Merger.Merge(bitMatrix, QRCodeEncoder.TypeNumber, imgMatrix); } return(BitMatrixDrawer.Draw(bitMatrix)); }
public override void Encode(IRgb24BitmapBase bitmap, Stream stream) { if (bitmap == null) { throw new ArgumentNullException(nameof(bitmap)); } if (stream == null) { throw new ArgumentNullException(nameof(stream)); } WriteHeader(stream); var context = new GifEncodingContext(bitmap, stream); var bmp = bitmap as IRgb24Bitmap; if (bmp != null && bmp.FrameCount > 1) { context.Colors = Enumerable.Range(0, bmp.FrameCount) .Select(i => bmp.GetFrame(i).GetPixels()) .SelectMany(l => l) .Distinct() .ToArray(); WriteLogicalScreenDescriptor(context); WriteColorTable(context); WriteApplicationExtensionBlock(context); WriteGraphicsControlExtension(context); for (var i = 0; i < bmp.FrameCount; i++) { var frame = bmp.GetFrame(i); var fContext = new GifEncodingContext(frame, stream); fContext.Data = frame.GetPixels(); fContext.Colors = context.Colors; WriteImageDescriptor(fContext); WriteImageData(fContext); } } else { context.Data = bitmap.GetPixels(); context.Colors = context.Data.Distinct().ToArray(); WriteLogicalScreenDescriptor(context); WriteColorTable(context); WriteImageDescriptor(context); WriteImageData(context); } // Trailer stream.WriteByte(0x3B); }
private static bool CheckImagePath(string imagePath, out IRgb24BitmapBase bitmap, out IRgb24BitmapBase bitmapText) { bitmapText = null; if (imagePath == null) { bitmap = null; return(true); } if (!File.Exists(imagePath)) { LogError("File not found."); bitmap = null; return(false); } try { Bitmap bmpp = (Bitmap) new Bitmap(500, 500); using (Graphics graph = Graphics.FromImage(bmpp)) { Rectangle ImageSize = new Rectangle(0, 0, 500, 500); graph.FillRectangle(Brushes.White, ImageSize); graph.SmoothingMode = SmoothingMode.AntiAlias; graph.InterpolationMode = InterpolationMode.HighQualityBicubic; graph.PixelOffsetMode = PixelOffsetMode.HighQuality; graph.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; StringFormat format = new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; RectangleF rectf = new RectangleF(10, 10, 480, 480); graph.DrawString("Text", new Font("Tahoma", 40), Brushes.Black, rectf, format); } bitmapText = new BitmapFrame(bmpp); var bmp = Bitmap.FromFile(imagePath) as Bitmap; bitmap = new BitmapFrame(bmp); return(true); } catch (Exception ex) { LogError(ex.Message); bitmap = null; return(false); } }
public ColorMatrix Colorize(IRgb24BitmapBase bitmap, int rowCount, int columnCount) { if (bitmap == null) { throw new ArgumentNullException(nameof(bitmap)); } var colorMatrix = new ColorMatrix(rowCount * 3, columnCount * 3); int[,] rgb24s = Sample(bitmap, rowCount * 3, columnCount * 3); for (int i = 0; i < rgb24s.GetLength(0); i++) { for (int j = 0; j < rgb24s.GetLength(1); j++) { colorMatrix[i, j] = rgb24s[i, j]; } } return(colorMatrix); }
private int[,] Sample(IRgb24BitmapBase bitmap, int rowCount, int columnCount) { float height = Convert.ToSingle(bitmap.Height); float width = Convert.ToSingle(bitmap.Width); float rowLength = Convert.ToSingle(rowCount); float columnLength = Convert.ToSingle(columnCount); int[,] rgb24s = new int[rowCount, columnCount]; for (int i = 0; i < columnCount; i++) { for (int j = 0; j < rowCount; j++) { int x = Convert.ToInt32(width / columnLength * i); int y = Convert.ToInt32(height / rowLength * j); int color = bitmap.GetPixel(x, y); rgb24s[j, i] = color; } } return(rgb24s); }
public BitMatrix Binarize(IRgb24BitmapBase bitmap, int rowCount, int columnCount) { if (bitmap == null) { throw new ArgumentNullException(nameof(bitmap)); } var bitMatrix = new BitMatrix(rowCount, columnCount); int[,] rgb24s = Sample(bitmap, rowCount, columnCount); int[,] grays = ToGrays(rgb24s); int[] histGram = GetHistGram(grays); int threhold = GetThreshold(histGram); for (int i = 0; i < grays.GetLength(0); i++) { for (int j = 0; j < grays.GetLength(1); j++) { bitMatrix[i, j] = grays[i, j] < threhold; } } return(bitMatrix); }
public virtual IImage Create(string data, IRgb24BitmapBase image, IRgb24BitmapBase imageText) { var bitMatrix = QRCodeEncoder.Build(data); //~20 ms if (image != null && 2 == 3) //qr code { int moduleCount = bitMatrix.Size; var imgBitMatrix = Binarizer.Binarize(image, moduleCount * 3, moduleCount * 3); var imgColorMatrix = Colorizer.Colorize(image, moduleCount * 3, moduleCount * 3); //var imgColorMatrix = new ColorSquare(moduleCount * 3); bitMatrix = Merger.Merge(bitMatrix, QRCodeEncoder.TypeNumber, imgBitMatrix); return(BitMatrixDrawer.Draw(bitMatrix, imgColorMatrix)); } else if (image != null) //text on image { int moduleCount = bitMatrix.Size; var imgColorMatrix = Colorizer.Colorize(image, moduleCount * 3, moduleCount * 3); var tripMatrix = new TripSquare(500); for (var i = 0; i < 500; i++) { for (var ii = 0; ii < 500; ii++) { tripMatrix[i, ii] = 0; } }//~20 ms since else if Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); for (var i = 5; i < 495; i++) { for (var ii = 5; ii < 495; ii++) { if (imageText.GetPixel(i, ii) < 12000000) { tripMatrix[ii, i] = 1; } if (imageText.GetPixel(i, ii) < 8000000) { tripMatrix[ii, i] = 2; } if (imageText.GetPixel(i, ii) < 4000000) { tripMatrix[ii, i] = 3; } } }//~110 ms for this double loop for (var i = 10; i < 500 - 10; i++) { for (var ii = 10; ii < 500 - 10; ii++) { /* * if (tripMatrix[i,ii] == 0){ * var minDist = 999; * for (var iii=i-10;iii<i+11;iii++){ * for (var iiii=ii-10;iiii<ii+11;iiii++){ * if (tripMatrix[iii,iiii] > 0){ * var d = (i-iii)*(i-iii)+(ii-iiii)*(ii-iiii); * if (d< minDist){ * minDist = d; * } * } * } * } * if (minDist < 51){ * tripMatrix[i,ii] = (2*minDist-150)/5; * } * } */ if (tripMatrix[i, ii] > 0) { for (var iii = i - 10; iii < i + 11; iii++) { for (var iiii = ii - 10; iiii < ii + 11; iiii++) { if (tripMatrix[iii, iiii] == 0) { var d = (i - iii) * (i - iii) + (ii - iiii) * (ii - iiii); if (d < 51) { tripMatrix[iii, iiii] = (2 * d - 150) / 5; } } else if (tripMatrix[iii, iiii] < 0) { var d = (i - iii) * (i - iii) + (ii - iiii) * (ii - iiii); if (d < 51) { var dd = (2 * d - 150) / 5; if (dd < tripMatrix[iii, iiii]) { tripMatrix[iii, iiii] = dd; } } } } } } } } stopWatch.Stop(); // Get the elapsed time as a TimeSpan value. TimeSpan ts = stopWatch.Elapsed; // Format and display the TimeSpan value. string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10); Console.WriteLine("QRArtCreatorTime " + elapsedTime); return(TripMatrixDrawer.Draw(tripMatrix, imgColorMatrix)); } else { Console.Out.WriteLine("no image"); var imgMatrix = new ColorSquare(bitMatrix.Size * 3); return(BitMatrixDrawer.Draw(bitMatrix, imgMatrix)); } }
public GifEncodingContext(IRgb24BitmapBase bitmap, Stream stream) { Bitmap = bitmap; Stream = stream; }
public static void Save(this IRgb24BitmapBase bitmap, Stream stream, IRgb24BitmapEncoder encoder) { encoder.Encode(bitmap, stream); }