//
// This code is part of Document Solutions for Imaging demos.
// Copyright (c) MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
using GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Imaging;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;
namespace DsImagingWeb.Demos
{
// This sample shows the results of enlarging a small (57 by 57 pixels) image
// of a QRCode using the 4 available interpolation modes.
// While for most images (such as portraits or landscapes), Linear or Cubic
// interpolation modes would normally yield better-looking results,
// for images like QRCodes or barcodes using the NearestNeighbor or
// Downscale modes is more appropriate.
//
// See EnlargeImage for an example where a small photo (portrait of a woman)
// is enlarged using the same 4 interpolation modes.
public class EnlargeQRCode
{
public GcBitmap GenerateImage(Size pixelSize, float dpi, bool opaque, string[] sampleParams = null)
{
// Create and clear the target bitmap:
var targetBmp = new GcBitmap(pixelSize.Width, pixelSize.Height, opaque, dpi, dpi);
targetBmp.Clear(Color.Transparent);
const int fontSize = 16;
var xpad = (int)(dpi * .5f);
var ypad = (int)(dpi * .7f);
TextFormat tf = new TextFormat
{
Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "times.ttf")),
FontSize = fontSize,
};
// Small image of a QRCode:
using var origBmp = new GcBitmap();
using (var stm = File.OpenRead(Path.Combine("Resources", "ImagesBis", "QRCode-57x57.png")))
origBmp.Load(stm);
// Make sure opaqueness of the original bitmap matches the target:
origBmp.Opaque = targetBmp.Opaque;
var ip = new Point(xpad, ypad);
// Draw the original with the original size:
targetBmp.BitBlt(origBmp, ip.X, ip.Y);
using (var g = targetBmp.CreateGraphics(null))
g.DrawString($"⟵ Original image ({origBmp.PixelWidth} by {origBmp.PixelHeight} pixels)", tf, new PointF(xpad * 2 + origBmp.Width, ip.Y));
ip.Y += origBmp.PixelHeight + ypad;
// We are going to enlarge the original small image by a factor of 6:
var f = 6;
int twidth = origBmp.PixelWidth * f;
int theight = origBmp.PixelHeight * f;
// Enlarge and draw 4 copies of the image using the 4 available interpolation modes:
using (var bmp = origBmp.Resize(twidth, theight, InterpolationMode.NearestNeighbor))
targetBmp.BitBlt(bmp, ip.X, ip.Y);
drawCaption("InterpolationMode.NearestNeighbor", ip.X, ip.Y + theight);
using (var bmp = origBmp.Resize(twidth, theight, InterpolationMode.Cubic))
targetBmp.BitBlt(bmp, ip.X + twidth + xpad, ip.Y);
drawCaption("InterpolationMode.Cubic", ip.X + twidth + xpad, ip.Y + theight);
ip.Y += theight + ypad;
using (var bmp = origBmp.Resize(twidth, theight, InterpolationMode.Linear))
targetBmp.BitBlt(bmp, ip.X, ip.Y);
drawCaption("InterpolationMode.Linear", ip.X, ip.Y + theight);
using (var bmp = origBmp.Resize(twidth, theight, InterpolationMode.Downscale))
targetBmp.BitBlt(bmp, ip.X + twidth + xpad, ip.Y);
drawCaption("InterpolationMode.Downscale", ip.X + twidth + xpad, ip.Y + theight);
//
void drawCaption(string caption, float x, float y)
{
using var g = targetBmp.CreateGraphics(null);
g.DrawString(caption, tf, new PointF(x, y));
}
return targetBmp;
}
}
}