C# System.drawing, sätta backgrundsfärg till svart?
Hej.
Kan inte påstå att det blivit så långa stunder i Visualstudio än men hittat ett litet projekt som jag nästan fått i land.
Jag vill skriva ut ID kort med en EAN13 kod. Koden för att generera EAN13 koden har jag hittat och lyckats fixa till så att den fungerar i Visualstudio 2019 med WPF, koden är från 2006 men det enda jag hittat som inte kostar massa pengar eller som bygger på en EAN13-font.
Till saken, jag vill sätta en svart bakgrund på bilden för att kunna göra texten vit. Sätter jag till svart i en wrappanel runt bilden blir tyvärr hela rutan svart vid utskrift. Någon som vill hjälpa mig eller peka mig i rätt riktning?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Printing;
namespace barcode
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
class Ean13
{
#region Static initialization
static Dictionary<int, Pattern> codes = new Dictionary<int, Pattern>();
static Dictionary<int, Parity> parity = new Dictionary<int, Parity>();
static Ean13()
{
// # LEFT ODD LEFT EVEN RIGHT
AddCode(0, "0001101", "0100111", "1110010");
AddCode(1, "0011001", "0110011", "1100110");
AddCode(2, "0010011", "0011011", "1101100");
AddCode(3, "0111101", "0100001", "1000010");
AddCode(4, "0100011", "0011101", "1011100");
AddCode(5, "0110001", "0111001", "1001110");
AddCode(6, "0101111", "0000101", "1010000");
AddCode(7, "0111011", "0010001", "1000100");
AddCode(8, "0110111", "0001001", "1001000");
AddCode(9, "0001011", "0010111", "1110100");
AddParity(0, "ooooo");
AddParity(1, "oeoee");
AddParity(2, "oeeoe");
AddParity(3, "oeeeo");
AddParity(4, "eooee");
AddParity(5, "eeooe");
AddParity(6, "eeeoo");
AddParity(7, "eoeoe");
AddParity(8, "eoeeo");
AddParity(9, "eeoeo");
}
static void AddCode(int digit, string lhOdd, string lhEven, string rh)
{
Pattern p = new Pattern();
p.LhOdd = lhOdd; p.LhEven = lhEven; p.Rh = rh;
codes.Add(digit, p);
}
static void AddParity(int digit, string par)
{
parity.Add(digit, new Parity(par));
}
#endregion
private Ean13Settings settings;
private string code;
private string title;
public Ean13(string code, string title)
: this(code, title, new Ean13Settings())
{
}
public Ean13(string code, string title, Ean13Settings settings)
{
this.settings = settings;
this.code = code;
this.title = title;
if (!CheckCode(code))
throw new ArgumentException("Invalid EAN-13 code specified.");
}
private bool CheckCode(string code)
{
if (code == null || code.Length != 13)
return false;
int res;
foreach (char c in code)
if (!int.TryParse(c.ToString(), out res))
return false;
char check = (char)('0' + CalculateChecksum(code.Substring(0, 12)));
return code[12] == check;
}
public static int CalculateChecksum(string code)
{
if (code == null || code.Length != 12)
throw new ArgumentException("Code length should be 12, i.e. excluding the checksum digit");
int sum = 0;
for (int i = 0; i < 12; i++)
{
int v;
if (!int.TryParse(code[i].ToString(), out v))
throw new ArgumentException("Invalid character encountered in specified code.");
sum += (i % 2 == 0 ? v : v * 3);
}
int check = 10 - (sum % 10);
return check % 10;
}
private int top;
public System.Drawing.Image Paint()
{
top = settings.TopMargin;
Graphics g = Graphics.FromImage(new Bitmap(1, 1));
int width = (3 + 6 * 7 + 5 + 6 * 7 + 3) * settings.BarWidth + settings.LeftMargin + settings.RightMargin + (int)g.MeasureString(code[0].ToString(), settings.Font).Width;
int height = settings.BarCodeHeight;
if (title != null)
{
int h = (int)g.MeasureString(title, settings.Font).Height;
height += h;
top += h;
}
Bitmap bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
g = Graphics.FromImage(bmp);
int left = settings.LeftMargin;
//LEFT GUARD
left = DrawLeftGuard(settings, g, code[0].ToString(), left);
//LEFT GROUP
int first = int.Parse(code[0].ToString());
Parity par = parity[first];
string digit = code[1].ToString();
left = Draw(settings, g, left, digit, codes[int.Parse(digit)].LhOdd); //Odd
for (int i = 2; i <= 6; i++)
{
digit = code[i].ToString();
Pattern p = codes[int.Parse(digit)];
left = Draw(settings, g, left, digit, (par.IsOdd(i - 2) ? p.LhOdd : p.LhEven));
}
//MIDDLE GUARD
left = DrawCenterGuard(settings, g, left);
//RIGHT GROUP
for (int i = 7; i <= 12; i++)
{
digit = code[i].ToString();
Pattern p = codes[int.Parse(digit)];
left = Draw(settings, g, left, digit, p.Rh);
}
//RIGHT GUARD
left = DrawRightGuard(settings, g, left);
return bmp;
}
private static System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Green);
private static System.Drawing.Brush brush = System.Drawing.Brushes.Green;
private int Draw(Ean13Settings settings, Graphics g, int left, string digit, string s)
{
int h = (int)(settings.BarCodeHeight * 0.8);
g.DrawString(digit, settings.Font, brush, left, h + top);
foreach (char c in s)
{
if (c == '1')
g.FillRectangle(brush, left, top, settings.BarWidth, h);
left += settings.BarWidth;
}
return left;
}
private int DrawLeftGuard(Ean13Settings settings, Graphics g, string digit, int left)
{
int h = (int)(settings.BarCodeHeight * 0.8);
//Här blev det 3 nya rader som löste det.
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, 211, 120);
System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black);
g.FillRectangle(myBrush, rect);
g.DrawString(digit, settings.Font, brush, left, h + top);
left += (int)g.MeasureString(digit, settings.Font).Width;
//TITLE
if (title != null)
g.DrawString(title, settings.Font, brush, left, settings.TopMargin);
g.FillRectangle(brush, left, top, settings.BarWidth, settings.BarCodeHeight); //1
left += settings.BarWidth;
left += settings.BarWidth; //0
g.FillRectangle(brush, left, top, settings.BarWidth, settings.BarCodeHeight); //1
left += settings.BarWidth;
return left;
}
private int DrawRightGuard(Ean13Settings settings, Graphics g, int left)
{
g.FillRectangle(brush, left, top, settings.BarWidth, settings.BarCodeHeight); //1
left += settings.BarWidth;
left += settings.BarWidth; //0
g.FillRectangle(brush, left, top, settings.BarWidth, settings.BarCodeHeight); //1
left += settings.BarWidth;
return left;
}
private int DrawCenterGuard(Ean13Settings settings, Graphics g, int left)
{
left += settings.BarWidth; //0
g.FillRectangle(brush, left, top, settings.BarWidth, settings.BarCodeHeight); //1
left += settings.BarWidth;
left += settings.BarWidth; //0
g.FillRectangle(brush, left, top, settings.BarWidth, settings.BarCodeHeight); //1
left += settings.BarWidth;
left += settings.BarWidth; //0
return left;
}
class Pattern
{
private string lhOdd;
public string LhOdd
{
get { return lhOdd; }
set { lhOdd = value; }
}
private string lhEven;
public string LhEven
{
get { return lhEven; }
set { lhEven = value; }
}
private string rh;
public string Rh
{
get { return rh; }
set { rh = value; }
}
}
class Parity
{
private string par;
internal Parity(string par)
{
this.par = par;
}
internal bool IsOdd(int i)
{
return par[i] == 'o';
}
internal bool IsEven(int i)
{
return par[i] == 'e';
}
}
}
class Ean13Settings
{
private int height = 120;
public int BarCodeHeight
{
get { return height; }
set { height = value; }
}
private int leftMargin = 10;
public int LeftMargin
{
get { return leftMargin; }
set { leftMargin = value; }
}
private int rightMargin = 10;
public int RightMargin
{
get { return rightMargin; }
set { rightMargin = value; }
}
private int topMargin = 10;
public int TopMargin
{
get { return topMargin; }
set { topMargin = value; }
}
private int bottomMargin = 10;
public int BottomMargin
{
get { return bottomMargin; }
set { bottomMargin = value; }
}
private int barWidth = 2;
public int BarWidth
{
get { return barWidth; }
set { barWidth = value; }
}
private Font font = new Font(System.Drawing.FontFamily.GenericSansSerif, 1);
internal Font Font
{
get { return font; }
}
}
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string code = var_myean13;
code += (char)('0' + Ean13.CalculateChecksum(code));
Ean13 barcode = new Ean13(code, null);
barcode.Paint().Save("c:\\temp\\test.png", ImageFormat.Png);
BitmapImage bi3 = new BitmapImage();
bi3.BeginInit();
bi3.UriSource = new Uri("c:\\temp\\test.png", UriKind.Absolute);
bi3.EndInit();
streckkod.Source = bi3;
// Create a PrintDialog
// PrintDialog printDlg = new PrintDialog();
//printDlg.PrintQueue = new PrintQueue(new PrintServer(), "Zebra BR110i Card Printer USB");
// printDlg.PrintVisual(panel_print, "Grid Printing.");
}
}
}