有关c#GDI绘图的一些方法

来源:互联网 发布:冒险岛市场数据库 编辑:程序博客网 时间:2024/05/02 04:41

 

 using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;
using System.IO;
using System.Drawing.Drawing2D;

namespace Tif
{
    
class TifEdit
    
{
        
//用白色擦除
        /// <summary>
        
/// 白色擦除
        
/// </summary>
        
/// <param name="bmp">图片文件</param>
        
/// <param name="p0">擦除区域的左上角坐标</param>
        
/// <param name="p1">擦除区域的又下角坐标</param>
        
/// <param name="RectColor">橡皮的颜色</param>
        
/// <returns>返回修改后的位图文件</returns>

        public static Bitmap FillRectangleInPicture(Bitmap bmp, Point p0, Point p1, Color RectColor)
        
{
            
if (bmp == null)
                
return null;
            Graphics g 
= Graphics.FromImage(bmp);
            Brush brush 
= new SolidBrush(RectColor); 
            
// g.DrawRectangle(pen, new Rectangle(p0.X, p0.Y, Math.Abs(p0.X - p1.X), Math.Abs(p0.Y - p1.Y)));
            g.FillRectangle(brush, new Rectangle(p0.X, p0.Y, Math.Abs(p0.X - p1.X), Math.Abs(p0.Y - p1.Y)));
            g.Dispose();
            
return bmp;
        }

        
//画线
        /// <summary>
        
/// 画直线
        
/// </summary>
        
/// <param name="bmp">图片文件</param>
        
/// <param name="p0">直线的起始坐标</param>
        
/// <param name="p1">直线的终止坐标</param>
        
/// <param name="LineColor">直线的颜色</param>
        
/// <param name="LineWidth">直线的宽度</param>
        
/// <param name="ds">直线的样式</param>
        
/// <returns></returns>

         public static Bitmap DrawLineInPicture(Bitmap bmp, Point p0, Point p1, Color LineColor, int LineWidth, DashStyle ds)
        
{
            
if (bmp == nullreturn null;
            
if (p0.X == p1.X || p0.Y == p1.Y) return bmp;
            Graphics g 
= Graphics.FromImage(bmp);
            Brush brush 
= new SolidBrush(LineColor);
            Pen pen 
= new Pen(brush, LineWidth);
            
//pen.Alignment = PenAlignment.Inset;
            pen.DashStyle = ds;
            g.DrawLine(pen,p0,p1);
            
            g.Dispose();
            
return bmp;
        }

        
//画矩形
        /// <summary>
        
/// 画矩形
        
/// </summary>
        
/// <param name="bmp">图片文件</param>
        
/// <param name="p0">矩形的左上角坐标</param>
        
/// <param name="p1">矩形的右下角坐标</param>
        
/// <param name="RectColor">矩形边框的颜色</param>
        
/// <param name="LineWidth">矩形边框的宽度</param>
        
/// <param name="ds">矩形边框的样式</param>
        
/// <returns></returns>

         public static Bitmap DrawRectangleInPicture(Bitmap bmp, Point p0, Point p1, Color RectColor, int LineWidth,DashStyle ds)
        
{
            
if (bmp == nullreturn null;
                     

            Graphics g 
= Graphics.FromImage(bmp);

            Brush brush 
= new SolidBrush(RectColor);
            Pen pen 
= new Pen(brush, LineWidth);
            pen.DashStyle 
= ds;

            g.DrawRectangle(pen, 
new Rectangle(p0.X, p0.Y, Math.Abs(p0.X - p1.X), Math.Abs(p0.Y - p1.Y)));

            g.Dispose();

            
return bmp;
        }

         
//合并TIF
        /// <summary>
        
/// 多个TIF文件的合并保存
        
/// </summary>
        
/// <param name="imageFiles">要合并的图象文件路径数组</param>
        
/// <param name="outFile">输出图象文件的路径</param>
        
/// <param name="compressEncoder">文件保存的编码方式</param>

        public static void JoinTiffImages(ArrayList imageFiles, string outFile, EncoderValue compressEncoder)
        
{

            
try
            
{
                
//If   only   one   page   in   the   collection,   copy   it   directly   to   the   target   file.   
                if (imageFiles.Count == 1)
                
{
                    File.Copy((
string)imageFiles[0], outFile, true);
                    
return;
                }

                
//use   the   save   encoder   
                System.Drawing.Imaging.Encoder enc = System.Drawing.Imaging.Encoder.SaveFlag;

                EncoderParameters ep 
= new EncoderParameters(2);
                ep.Param[
0= new EncoderParameter(enc, (long)EncoderValue.MultiFrame);
                ep.Param[
1= new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)compressEncoder);

                Bitmap pages 
= null;
                
int frame = 0;
                ImageCodecInfo info 
= GetEncoderInfo("image/tiff");

                
foreach (string strImageFile in imageFiles)
                
{
                    
if (frame == 0)
                    
{
                        pages 
= (Bitmap)Image.FromFile(strImageFile);

                        
//save   the   first   frame   
                        pages.Save(outFile, info, ep);
                      
                    }

                    
else
                    
{
                        
//save   the   intermediate   frames   
                        ep.Param[0= new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage);

                        Bitmap bm 
= (Bitmap)Image.FromFile(strImageFile);
                        pages.SaveAdd(bm, ep);
                        bm.Dispose();
                    }


                    
if (frame == imageFiles.Count - 1)
                    
{
                        
//flush   and   close.   
                        ep.Param[0= new EncoderParameter(enc, (long)EncoderValue.Flush);
                        pages.SaveAdd(ep);
                    }


                    frame
++;
                }

            }

            
catch (Exception ex)
            
{
                
#if   DEBUG
                                Console.WriteLine(ex.Message);
                
#endif
                
throw;
            }


            
return;
        }

        
private static ImageCodecInfo GetEncoderInfo(String mimeType)
        
{
            
int j;
            ImageCodecInfo[] encoders;
            encoders 
= ImageCodecInfo.GetImageEncoders();
            
for (j = 0; j < encoders.Length; ++j)
            
{
                
if (encoders[j].MimeType == mimeType)
                    
return encoders[j];
            }

            
return null;
        }


        
//合并Tiff
    
        
/// <summary>
        
/// 多个TIF文件的合并保存
        
/// </summary>
        
/// <param name="imageFiles">要合并的图象文件路径数组</param>
        
/// <param name="outFile">输出图象文件的路径</param>
        
/// <param name="compressEncoder">文件保存的编码方式</param>

        public static void JoinTiffZJ(ArrayList imageArray, string outFile, EncoderValue compressEncoder)
        
{
            
if (imageArray.Count == 1)
            
{
                File.Copy((
string)imageArray[0], outFile, true);
                
return;
            }

            Bitmap multi
=null;
            ImageCodecInfo myImageCodecInfo;
            System.Drawing.Imaging.Encoder myEncoder;
            EncoderParameter myEncoderParameter;
            EncoderParameters myEncoderParameters;
            
// Get an ImageCodecInfo object that represents the TIFF codec.
            myImageCodecInfo = GetEncoderInfo("image/tiff");

            
// Create an Encoder object based on the GUID
            
// for the SaveFlag parameter category.
            myEncoder = System.Drawing.Imaging.Encoder.SaveFlag;

            
// Create an EncoderParameters object.
            
// An EncoderParameters object has an array of EncoderParameter
            
// objects. In this case, there is only one
            
// EncoderParameter object in the array.
            myEncoderParameters = new EncoderParameters(1);

            
// Save the first page (frame).保存第一帧
            for (int i = 0; i < imageArray.Count; i++)
            
{
                
if (i == 0)
                
{
                    multi 
= new Bitmap(Image.FromFile((string)imageArray[i]));
                    myEncoderParameter 
= new EncoderParameter(myEncoder, (long)EncoderValue.MultiFrame);
                    myEncoderParameters.Param[
0= myEncoderParameter;
                    multi.Save(outFile, myImageCodecInfo, myEncoderParameters);
                }

                
else
                
{
                    
// Save the second page (frame).
                    Bitmap page2 = new Bitmap(Image.FromFile((string)imageArray[i]));
                    myEncoderParameter 
= new EncoderParameter(myEncoder, (long)EncoderValue.FrameDimensionPage);
                    myEncoderParameters.Param[
0= myEncoderParameter;
                    multi.SaveAdd(page2, myEncoderParameters);
                }

                
//关闭文件
                if (i == imageArray.Count - 1)
                
{
                    myEncoderParameter 
= new EncoderParameter(myEncoder, (long)EncoderValue.Flush);
                    myEncoderParameters.Param[
0= myEncoderParameter;
                    multi.SaveAdd(myEncoderParameters); 
                }

            }

       }

        
//写字
       /// <summary>
       
/// 在图片上绘制文字
       
/// </summary>
       
/// <param name="b">图片文件</param>
       
/// <param name="txt">绘制的文字内容</param>
       
/// <param name="font">文字的字体信息</param>
       
/// <param name="c">文字的颜色</param>
       
/// <param name="x">文字绘制位置的x坐标</param>
       
/// <param name="y">文字绘制位置的y坐标</param>
       
/// <returns></returns>

        public static Bitmap KiSetText(Bitmap b, string txt, Font font, Color c, int x, int y)
        
{
            
if (b == null)
            
{
                
return null;
            }


            Graphics g 
= Graphics.FromImage(b);
            g.TextRenderingHint 
= System.Drawing.Text.TextRenderingHint.AntiAlias;
            SolidBrush sb 
= new SolidBrush(c);
            g.DrawString(txt, font, sb, 
new PointF(x, y));
            g.Dispose();

            
return b;
        }

        
//画圈
        /// <summary>
        
/// 画圈
        
/// </summary>
        
/// <param name="bmp">图片文件</param>
        
/// <param name="p0">圈的左上角坐标</param>
        
/// <param name="p1">圈的右下角坐标</param>
        
/// <param name="RectColor">圈的边框的颜色</param>
        
/// <param name="LineWidth">圈的边框的宽度</param>
        
/// <param name="ds">圈的边框的样式</param>
        
/// <returns></returns>

        public static Bitmap DrawRoundInPicture(Bitmap bmp, Point p0, Point p1, Color RectColor, int LineWidth, DashStyle ds)
        
{
            
if (bmp == nullreturn null;

            Graphics g 
= Graphics.FromImage(bmp);

            Brush brush 
= new SolidBrush(RectColor);
            Pen pen 
= new Pen(brush, LineWidth);
            pen.DashStyle 
= ds;

            g.DrawEllipse(pen, 
new Rectangle(p0.X, p0.Y, Math.Abs(p0.X - p1.X), Math.Abs(p0.Y - p1.Y)));
           
            g.Dispose();

            
return bmp;
        }

        
//填充的圈
        /// <summary>
        
/// 画实心圈
        
/// </summary>
        
/// <param name="bmp">图片文件</param>
        
/// <param name="p0">圈的左上角坐标</param>
        
/// <param name="p1">圈的右下脚坐标</param>
        
/// <param name="RectColor">圈的颜色</param>
        
/// <returns></returns>

        public static Bitmap FillEllipseInPicture(Bitmap bmp, Point p0, Point p1, Color RectColor)
        
{
            
if (bmp == null)
                
return null;
            Graphics g 
= Graphics.FromImage(bmp);
            Brush brush 
= new SolidBrush(RectColor);
            
// g.DrawRectangle(pen, new Rectangle(p0.X, p0.Y, Math.Abs(p0.X - p1.X), Math.Abs(p0.Y - p1.Y)));
           
// g.FillRectangle(brush, new Rectangle(p0.X, p0.Y, Math.Abs(p0.X - p1.X), Math.Abs(p0.Y - p1.Y)));
            g.FillEllipse(brush, new Rectangle(p0.X, p0.Y, Math.Abs(p0.X - p1.X), Math.Abs(p0.Y - p1.Y)));
            g.Dispose();
            
return bmp;
            
           
        }

        
//画路径
        /// <summary>
        
///跟随鼠标画曲线
        
/// </summary>
        
/// <param name="bmp">图片文件</param>
        
/// <param name="graphPath">线的路径</param>
        
/// <param name="RectColor">线的颜色</param>
        
/// <param name="LineWidth">线的宽度</param>
        
/// <param name="ds">线的样式</param>
        
/// <returns></returns>

        public static Bitmap DrawPathInPicture(Bitmap bmp, GraphicsPath graphPath, Color RectColor, int LineWidth, DashStyle ds)
        
{
            
if (bmp == null)
                
return null;

            Graphics g 
= Graphics.FromImage(bmp);

            Brush brush 
= new SolidBrush(RectColor);
            Pen pen 
= new Pen(brush, LineWidth);
            pen.DashStyle 
= ds;
            
//g.DrawEllipse(pen, new Rectangle(p0.X, p0.Y, Math.Abs(p0.X - p1.X), Math.Abs(p0.Y - p1.Y)));
            g.DrawPath(pen, graphPath);
            g.Dispose();

            
return bmp;
        }

    
    }

}