Csharp/C Sharp/2D Graphics/Bitmap

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Bitmap.HorizontalResolution

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; public class Form1 : Form {

   protected override void OnPaint(PaintEventArgs e) {
   Graphics g = e.Graphics;
   Bitmap bmp = new Bitmap("rama.jpg");
   g.DrawImage(bmp, 0, 0);
   Console.WriteLine("Screen resolution: " + g.DpiX + "DPI");
   Console.WriteLine("Image resolution: " + bmp.HorizontalResolution + "DPI");
   Console.WriteLine("Image Width: " + bmp.Width);
   Console.WriteLine("Image Height: " + bmp.Height);
   SizeF s = new SizeF(bmp.Width * (g.DpiX / bmp.HorizontalResolution),
             bmp.Height * (g.DpiY / bmp.VerticalResolution));
   Console.WriteLine("Display size of image: " + s);
   }
   public static void Main() {
       Application.Run(new Form1());
   }

}

</source>


Bitmap property: Height, Physical Dimension, width, raw format and size

<source lang="csharp"> using System; using System.IO; using System.Drawing;

class MainClass {

   static public void Main()
   {
       Bitmap img = new Bitmap("winter.jpg");
       
       Console.WriteLine(img.PhysicalDimension.ToString() );
       Console.WriteLine(img.Height.ToString() );
       Console.WriteLine(img.Width.ToString() );
       Console.WriteLine(img.RawFormat.ToString() );
       Console.WriteLine(img.Size.ToString() );
   }

}

      </source>


Bitmap.SetResolution

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; public class Form1 : Form {

   protected override void OnPaint(PaintEventArgs e) {
   Graphics g = e.Graphics;
   Bitmap bmp = new Bitmap("rama.jpg");
   g.FillRectangle(Brushes.White, this.ClientRectangle);
   bmp.SetResolution(600f, 600f);
   g.DrawImage(bmp, 0, 0);
   bmp.SetResolution(1200f, 1200f);
   g.DrawImage(bmp, 180, 0);
   }
   public static void Main() {
       Application.Run(new Form1());
   }

}

</source>


Bit operation with PixelFormat.Alpha

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Text; using System.Windows.Forms; public class MainClass {

   public static void Main() {
       // Create two new bitmap images
       Bitmap bmp1 = new Bitmap(100, 100, PixelFormat.Format32bppArgb);
       Bitmap bmp2 = new Bitmap(100, 100, PixelFormat.Format24bppRgb);
       // Test for alpha 
       bool b1 = ((bmp1.PixelFormat & PixelFormat.Alpha) != 0);
       bool b2 = ((bmp2.PixelFormat & PixelFormat.Alpha) != 0);
       // Output results to console window
       Console.WriteLine("bmp1 has alpha?: " + b1);
       Console.WriteLine("bmp2 has alpha?: " + b2);
       // Clean up
       bmp1.Dispose();
       bmp2.Dispose();
   }

}

</source>


Create a Bitmap image in memory and set its CompositingMode

<source lang="csharp">

using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; public class Form1 : Form {

   protected override void OnPaint(PaintEventArgs e) {
   Graphics gForm = e.Graphics;
   gForm.FillRectangle(Brushes.White, this.ClientRectangle);
   for (int i = 1; i <= 7; ++i)
   {
     Rectangle r = new Rectangle(i * 40 - 15, 0, 15,
                   this.ClientRectangle.Height);
     gForm.FillRectangle(Brushes.Orange, r);
   }
   Bitmap bmp = new Bitmap(260, 260,System.Drawing.Imaging.PixelFormat.Format32bppArgb);
   Graphics gBmp = Graphics.FromImage(bmp);
   gBmp.rupositingMode = System.Drawing.Drawing2D.rupositingMode.SourceCopy;
   gForm.DrawImage(bmp, 20, 20, bmp.Width, bmp.Height);
   bmp.Dispose();
   gBmp.Dispose();
   }
   public static void Main() {
       Application.Run(new Form1());
   }

}

</source>


Create a green color with an alpha component then draw a green rectangle to the bitmap in memory

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; public class Form1 : Form {

   protected override void OnPaint(PaintEventArgs e) {
       Graphics gForm = e.Graphics;
       gForm.FillRectangle(Brushes.White, this.ClientRectangle);
       for (int i = 1; i <= 7; ++i) {
           Rectangle r = new Rectangle(i * 40 - 15, 0, 15,
                                       this.ClientRectangle.Height);
           gForm.FillRectangle(Brushes.Orange, r);
       }
       Bitmap bmp = new Bitmap(260, 260, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
       Graphics gBmp = Graphics.FromImage(bmp);
       Color green = Color.FromArgb(0x40, 0, 0xff, 0);
       Brush greenBrush = new SolidBrush(green);
       gBmp.FillRectangle(greenBrush, 10, 10, 140, 140);
       gForm.DrawImage(bmp, 20, 20, bmp.Width, bmp.Height);
       bmp.Dispose();
       gBmp.Dispose();
       greenBrush.Dispose();
   }
   public static void Main() {
       Application.Run(new Form1());
   }

}

</source>


Create a red color with an alpha component then draw a red circle to the bitmap in memory

<source lang="csharp">

using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; public class Form1 : Form {

   protected override void OnPaint(PaintEventArgs e) {
   Graphics gForm = e.Graphics;
   gForm.FillRectangle(Brushes.White, this.ClientRectangle);
   for (int i = 1; i <= 7; ++i)
   {
     Rectangle r = new Rectangle(i * 40 - 15, 0, 15,this.ClientRectangle.Height);
     gForm.FillRectangle(Brushes.Orange, r);
   }
   Bitmap bmp = new Bitmap(260, 260,System.Drawing.Imaging.PixelFormat.Format32bppArgb);
   Graphics gBmp = Graphics.FromImage(bmp);
   Color red = Color.FromArgb(0x60, 0xff, 0, 0);
   Brush redBrush = new SolidBrush(red);
   gBmp.FillEllipse(redBrush, 70, 70, 160, 160);
   gForm.DrawImage(bmp, 20, 20, bmp.Width, bmp.Height);
   bmp.Dispose();
   gBmp.Dispose();
   redBrush.Dispose();
   }
   public static void Main() {
       Application.Run(new Form1());
   }

}

</source>


Create Graphics object From Image

<source lang="csharp"> using System; using System.Drawing; using System.Windows.Forms;

class HelloWorldBitmap: Form {

    const  float fResolution = 300;
    Bitmap bitmap = new Bitmap(1, 1);
  
    public static void Main()
    {
         Application.Run(new HelloWorldBitmap());
    }
    public HelloWorldBitmap()
    {
         ResizeRedraw = true; 
         
         bitmap.SetResolution(fResolution, fResolution);
  
         Graphics grfx = Graphics.FromImage(bitmap);
         Font     font = new Font("Times New Roman", 72);
         Size     size = grfx.MeasureString(Text, font).ToSize();
  
         bitmap = new Bitmap(bitmap, size);
         bitmap.SetResolution(fResolution, fResolution);
              
         grfx = Graphics.FromImage(bitmap);
         grfx.Clear(Color.White);
         grfx.DrawString(Text, font, Brushes.Black, 0, 0);
         grfx.Dispose();
    }
    protected override void OnPaint(PaintEventArgs pea)
    {
         grfx.DrawImage(bitmap, 0, 0);
    }

}

</source>


Create your own BitMap

<source lang="csharp">

 using System;
 using System.Drawing;
 using System.Drawing.Drawing2D;
 using System.Collections;
 using System.ruponentModel;
 using System.Windows.Forms;
 using System.Data;
 using System.Drawing.Imaging;
 public class Form1 : System.Windows.Forms.Form
 {
   public Form1()
   {
     InitializeComponent();
   }
   private void InitializeComponent()
   {
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(292, 273);
     this.Text = "";
     this.Resize += new System.EventHandler(this.Form1_Resize);
     this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
   }
   static void Main() 
   {
     Application.Run(new Form1());
   }
   private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
   {      
     Bitmap bmp = new Bitmap(100, 100);
     Graphics gImage = Graphics.FromImage(bmp);
     gImage.FillRectangle(Brushes.Red, 0, 0, bmp.Width, bmp.Height);
     gImage.DrawRectangle(Pens.Black, 10, 10, bmp.Width - 20, bmp.Height - 20);
     Graphics gScreen = e.Graphics;
     gScreen.FillRectangle(Brushes.White, this.ClientRectangle);
     gScreen.DrawImage(bmp, new Rectangle(10, 10, bmp.Width, bmp.Height));
   }
   private void Form1_Resize(object sender, System.EventArgs e)
   {
     Invalidate();
   }
 }


      </source>


Double buffer with Bitmap

<source lang="csharp"> using System; using System.Drawing; using System.Windows.Forms; public class Form1 : Form {

   Pen p;
   SolidBrush b, bT = new SolidBrush(Color.Black);
   string path = "5.bmp";
   Image im;
   Font f;
   public Form1() {
       Color cP = Color.Gray;
       Color cB = Color.LightGray;
       p = new Pen(cP, 6);
       b = new SolidBrush(cB);
       im = Image.FromFile(path);
       f = new Font(new FontFamily("Times New Roman"), 10);
   }
   static void Main() {
       Application.Run(new Form1());
   }
   protected override void OnPaint(PaintEventArgs pea) {
       Sketch();
       //SketchDBuf();
   }
   private void Sketch() {
       Graphics g = Graphics.FromHwnd(this.Handle);
       g.FillRectangle(b, 4, 4, 260, 220);
       g.DrawRectangle(p, 4, 4, 260, 220);
       g.DrawImage(im, 33, 35, 200, 145);
       g.DrawString("AAAAAA", f, bT, 180, 190);
       g.Dispose();
   }
   private void SketchDBuf() {
       int hh = 3, w = 260, h = 220;
       Graphics g;
       Bitmap bm = new Bitmap(w + 2 * hh, h + 2 * hh);
       g = Graphics.FromImage(bm);
       g.FillRectangle(b, hh, hh, w, h);
       g.DrawRectangle(new Pen(Color.Gray, 2 * hh), hh, hh, w, h);
       g.DrawImage(im, hh + 30, hh + 32, 200, 145);
       g.DrawString("Text", f, bT, 180, 190);
       g = Graphics.FromHwnd(this.Handle);
       g.DrawImage(bm, 1, 1);
       g.Dispose();
   }

}

</source>


Draw an array of images

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; public class MainForm : Form {

   private Bitmap[] myImages = new Bitmap[3];
   public MainForm() {
       myImages[0] = new Bitmap("imageA.bmp");
       myImages[1] = new Bitmap("imageB.bmp");
       myImages[2] = new Bitmap("imageC.bmp");
   }
   protected void OnPaint(PaintEventArgs e) {
       Graphics g = e.Graphics;
       int yOffset = 10;
       foreach (Bitmap b in myImages) {
           g.DrawImage(b, 10, yOffset, 90, 90);
           yOffset += 100;
       }
   }
   public static void Main() {
       Application.Run(new MainForm());
   }

}

</source>


Draw on an Bitmap

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; public class Form1 : Form {

   protected override void OnPaint(PaintEventArgs e) {
   Bitmap bmp = new Bitmap(100, 100);
   Graphics gImage = Graphics.FromImage(bmp);
   gImage.FillRectangle(Brushes.Red, 0, 0, bmp.Width, bmp.Height);
   gImage.DrawRectangle(Pens.Black, 10, 10, bmp.Width - 20, bmp.Height - 20);
   Graphics gScreen = e.Graphics;
   gScreen.FillRectangle(Brushes.White, this.ClientRectangle);
   gScreen.DrawImage(bmp, new Rectangle(10, 10, bmp.Width, bmp.Height));
   }
   public static void Main() {
       Application.Run(new Form1());
   }

}

</source>


Draw shapes to the bitmap in memory

<source lang="csharp">

 using System;
 using System.Drawing;
 using System.Drawing.Drawing2D;
 using System.Collections;
 using System.ruponentModel;
 using System.Windows.Forms;
 using System.Data;
 using System.Drawing.Imaging;
 public class Form1 : System.Windows.Forms.Form
 {
   public Form1()
   {
     InitializeComponent();
   }
   private void InitializeComponent()
   {
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(292, 273);
     this.Text = "";
     this.Resize += new System.EventHandler(this.Form1_Resize);
     this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
   }
   static void Main() 
   {
     Application.Run(new Form1());
   }
   private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
   {      
     Graphics gForm = e.Graphics;
     gForm.FillRectangle(Brushes.White, this.ClientRectangle);
     // Create a Bitmap image in memory and set its CompositingMode
     Bitmap bmp = new Bitmap(260, 260, PixelFormat.Format32bppArgb);
     Graphics gBmp = Graphics.FromImage(bmp);
     gBmp.rupositingMode = CompositingMode.SourceCopy;
     // draw a red circle to the bitmap in memory
     Color red = Color.FromArgb(0x60, 0xff, 0, 0);
     Brush redBrush = new SolidBrush(red);
     gBmp.FillEllipse(redBrush, 70, 70, 160, 160);
     // draw a green rectangle to the bitmap in memory
     Color green = Color.FromArgb(0x40, 0, 0xff, 0);
     Brush greenBrush = new SolidBrush(green);
     gBmp.FillRectangle(greenBrush, 10, 10, 140, 140);
     
     // draw the bitmap on our window
     gForm.DrawImage(bmp, 20, 20, bmp.Width, bmp.Height);
     bmp.Dispose();
     gBmp.Dispose();
     redBrush.Dispose();
     greenBrush.Dispose();
   }
   private void Form1_Resize(object sender, System.EventArgs e)
   {
     Invalidate();
   }
 }
          
      </source>


new Bitmap(bitmap, size)

<source lang="csharp">

using System; using System.Drawing; using System.Windows.Forms; class HelloWorldBitmap : Form {

   const float fResolution = 300;
   Bitmap bitmap = new Bitmap(1, 1);
   public static void Main() {
       Application.Run(new HelloWorldBitmap());
   }
   public HelloWorldBitmap() {
       Text = "Hello, World!";
       ResizeRedraw = true;
       bitmap.SetResolution(fResolution, fResolution);
       Graphics grfx = Graphics.FromImage(bitmap);
       Font font = new Font("Times New Roman", 72);
       Size size = grfx.MeasureString(Text, font).ToSize();
       bitmap = new Bitmap(bitmap, size);
       bitmap.SetResolution(fResolution, fResolution);
       grfx = Graphics.FromImage(bitmap);
       grfx.Clear(Color.White);
       grfx.DrawString(Text, font, Brushes.Black, 0, 0);
       grfx.Dispose();
   }
   protected override void OnPaint(PaintEventArgs pea) {
       pea.Graphics.DrawImage(bitmap, 0, 0);
   }

}

</source>


PixelFormat.DontCare

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; public class Form1 : Form {

   protected override void OnPaint(PaintEventArgs e) {
   Graphics g = e.Graphics;
   Bitmap bmp = new Bitmap("rama.jpg");
   g.FillRectangle(Brushes.White, this.ClientRectangle);
   Rectangle r = new Rectangle(120, 120, 400, 400);
   Bitmap bmp2 = bmp.Clone(r, System.Drawing.Imaging.PixelFormat.DontCare);
   g.DrawImage(bmp, new Rectangle(0, 0, 200, 200));
   g.DrawImage(bmp2, new Rectangle(210, 0, 200, 200));
   bmp2.Dispose();
   }
   public static void Main() {
       Application.Run(new Form1());
   }

}

</source>


Read Bitmap Size by using BinaryReader

<source lang="csharp">

using System; using System.IO;

class Class1 {

   static void Main(string[] args) {
       string[] cma = Environment.GetCommandLineArgs();
       if (cma.GetUpperBound(0) >= 1) {
           FileStream myFStream = new FileStream(cma[1], FileMode.Open, FileAccess.Read);
           BinaryReader binRead = new BinaryReader(myFStream);
           binRead.BaseStream.Position = 0x12;
           
           Console.WriteLine(binRead.ReadInt32());
           Console.WriteLine(binRead.ReadInt32());
           Console.WriteLine(binRead.ReadInt16());
           Console.WriteLine(binRead.ReadInt16());
           binRead.Close();
           myFStream.Close();
       }
   }

}

</source>


Resize the Bitmap using the highest quality interpolation mode

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Text; using System.Windows.Forms; public class Form1 : Form {

   protected override void OnPaint(PaintEventArgs e) {
   Graphics g = e.Graphics;
   Bitmap bmp = new Bitmap("rama.jpg");
   g.FillRectangle(Brushes.White, this.ClientRectangle);
   int width = bmp.Width;
   int height = bmp.Height;
   g.InterpolationMode = InterpolationMode.HighQualityBicubic;
   g.DrawImage(
     bmp,
     new Rectangle(130, 10, 120, 120),   // source rectangle
     new Rectangle(0, 0, width, height), // destination rectangle
     GraphicsUnit.Pixel);
   }
   public static void Main() {
       Application.Run(new Form1());
   }

}

</source>


Resize the Bitmap using the lowest quality interpolation mode

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Text; using System.Windows.Forms; public class Form1 : Form {

   protected override void OnPaint(PaintEventArgs e) {
   Graphics g = e.Graphics;
   Bitmap bmp = new Bitmap("rama.jpg");
   g.FillRectangle(Brushes.White, this.ClientRectangle);
   int width = bmp.Width;
   int height = bmp.Height;
   g.InterpolationMode = InterpolationMode.NearestNeighbor;
   g.DrawImage(
     bmp,
     new Rectangle(10, 10, 120, 120),    // source rectangle
     new Rectangle(0, 0, width, height), // destination rectangle
     GraphicsUnit.Pixel);
   }
   public static void Main() {
       Application.Run(new Form1());
   }

}

</source>


Use a color matrix to change the color properties of the image

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Text; using System.Drawing.Printing; using System.Drawing.Drawing2D; using System.Text; using System.Windows.Forms; public class Form1 : Form {

   protected override void OnPaint(PaintEventArgs e) {
       Bitmap bmp = new Bitmap("alphabet.gif");
       Graphics g = e.Graphics;
       float[][] matrixItems = {
                   new float[] {0.2f, 0, 0, 0, 0},
                   new float[] {0, 0.8f, 0, 0, 0},
                   new float[] {0, 0, 1, 0, 0},
                   new float[] {0, 0, 0, 1, 0}, 
                   new float[] {0, 0, 0, 0, 1}};
       ColorMatrix colorMatrix = new ColorMatrix(matrixItems);
       ImageAttributes imageAtt = new ImageAttributes();
       imageAtt.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
       TextureBrush tb = new TextureBrush(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), imageAtt);
       tb.WrapMode = WrapMode.Tile;
       g.FillRectangle(tb, this.ClientRectangle);
       bmp.Dispose();
       tb.Dispose();
   }
   public static void Main() {
       Application.Run(new Form1());
   }

}

</source>


write the pixel information to the console window

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; public class Form1 : Form {

   protected override void OnPaint(PaintEventArgs e) {
   Graphics gForm = e.Graphics;
   gForm.FillRectangle(Brushes.White, this.ClientRectangle);
   Bitmap bmp = new Bitmap(6, 6);
   Graphics gBmp = Graphics.FromImage(bmp);
   gBmp.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);
   gBmp.DrawLine(Pens.Red, 0, 0, 5, 5);
   gForm.DrawImage(bmp, 20, 20, bmp.Width, bmp.Height);
   
   for (int y = 0; y < bmp.Height; ++y)
   {
     for (int x = 0; x < bmp.Width; ++x)
     {
       Color c = bmp.GetPixel(x, y);
       Console.Write("{0,2:x}{1,2:x}{2,2:x}{3,2:x}  ",c.A, c.R, c.G, c.G);
     }
     Console.WriteLine();
   }
   bmp.Dispose();
   }
   public static void Main() {
       Application.Run(new Form1());
   }

}

</source>