• C#(99):图像Image类、打印Printing相关


    一、Images

    1、概述

    Image 类为Bitmap(位图) 和 Metafile(矢量图) 的类提供功能的抽象基类。Image类不能直接创建对象的,但Image.FromFile()返回的是Bitmap或者Metafile的对象。

    初始化Image:

    Image img0 = Image.FromFile(@"C:1.jpg");
    Image img1 = Image.FromStream(File.OpenRead(@"C:1.jpg"));
    Image img2 = new Bitmap(@"C:1.jpg");

    2、属性

    • PixelFormat    获取此 Image 的像素格式。
    • RawFormat    获取此 Image 的文件格式。
    • Size    获取此图像的宽度和高度(以像素为单位)。
    • Width    获取此 Image 的宽度(以像素为单位)。
    • Height    获取此 Image 的高度(以像素为单位)。

    3、方法

    • FromFile(String)    从指定的文件创建 Image。
    • FromStream(Stream)    从指定的数据流创建 Image。
    • GetBounds(GraphicsUnit)    以指定的单位获取图像的界限。
    • GetThumbnailImage(Int32, Int32, Image+GetThumbnailImageAbort, IntPtr)    返回此 Image 的缩略图。
    • RotateFlip(RotateFlipType)    旋转、翻转或者同时旋转和翻转 Image。
    • Save(Stream, ImageFormat)    将此图像以指定的格式保存到指定的流中。
    • Save(String, ImageFormat)    将此 Image 以指定格式保存到指定文件。

    绘制图片:

    using (Image img = new Bitmap(@"C:1.jpg"))
    {
        System.Drawing.Graphics g = Graphics.FromImage(img);
        g.DrawImage(img, new System.Drawing.Rectangle(0, 0, img.Width, img.Height));
    }

    缩放:

    Image img1 = new Bitmap(@"C:1.jpg");
    using (Image smallImage = new Bitmap(img1, new Size(img1.Width / 2, img1.Height / 2)))
    {
        //...
    }

    获取缩略图

    Bitmap myBitmap = new Bitmap("Climber.jpg");
    Image myThumbnail = myBitmap.GetThumbnailImage(40, 40, null, IntPtr.Zero);
    e.Graphics.DrawImage(myThumbnail, 150, 75);

    旋转

    Image img = Bitmap.FromFile(@"C:music.bmp");
    PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
    PictureBox1.Image = img;
    //旋转
    img.RotateFlip(RotateFlipType.Rotate180FlipY);
    PictureBox1.Image = img;

    双倍缓冲

    //创建一个与窗体工作区大小相同的空位图
    using (Bitmap image = new Bitmap(ClientRectangle.Width, ClientRectangle.Height))//创建位图实例
    {
        Graphics g = Graphics.FromImage(image);//以此图像做画布,画图形
        g.FillRectangle(Brushes.White, ClientRectangle);
        g.DrawImage(image, ClientRectangle);  //在窗体中绘制出内存中的图像
    }

    格式转换与保存:

    img.Save("c:/1.jpg", ImageFormat.Jpeg);
    img.Save("c:/1.gif", ImageFormat.Gif);

    二、打印 System.Drawing.Printing

    1、打印预览

    PrintDocument pd = new PrintDocument();
    pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
    PrintPreviewDialog ppd = new PrintPreviewDialog();
    ppd.Document = pd;
    ppd.ShowDialog();

    2、打印

    PrintDocument pd = new PrintDocument();
    pd.DefaultPageSettings.PrinterSettings.PrinterName = "ZDesigner GX430t";       //打印机名称
    pd.DefaultPageSettings.Landscape = true;  //设置横向打印,不设置默认是纵向的
    pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
    pd.Print();

    3、分页打印文本文件

    多页打印必须把HasMorePages 设为true,达到需要的页数后关掉此属性。否则无穷添加新页面!

    当HasMorePages 设为true后,PrintDocument_PrintPage重复自我运行,直到HasMorePages 设为false。

    private string text = string.Empty;
    private int top = 0;
    private Size textSize = Size.Empty;
    
    
    private void button1_Click(object sender, EventArgs e)
    {
        text = this.textBox1.Text;
        PrintDocument pd = new PrintDocument();
        pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
        pd.BeginPrint += new PrintEventHandler(pd_BeginPrint);
    
        using (System.Windows.Forms.PrintPreviewDialog dlg = new PrintPreviewDialog())
        {
            dlg.Document = pd;
            dlg.WindowState = FormWindowState.Maximized;
            dlg.AllowTransparency = true;
            dlg.AutoScaleMode = AutoScaleMode.Dpi;
            dlg.ShowDialog();
        }
    }
    
    private void pd_BeginPrint(object sender, PrintEventArgs e)
    {
        textSize = Size.Empty;
        top = 0;
    }
    
    private void pd_PrintPage(object sender, PrintPageEventArgs e)
    {
        if (textSize == Size.Empty)
        {
            textSize = Size.Round(e.Graphics.MeasureString(text, Font, e.MarginBounds.Width));
        }
        e.Graphics.SetClip(e.MarginBounds);
        e.Graphics.DrawString(text, this.Font, Brushes.Black, new Rectangle(e.MarginBounds.Location.X, e.MarginBounds.Location.Y + top * -1, textSize.Width, textSize.Height)); ;
        if (top + e.MarginBounds.Height < textSize.Height)
        {
            top = top + e.MarginBounds.Height;
            e.HasMorePages = true;
        }
    }
  • 相关阅读:
    Redis的四种模式,单机、主从、哨兵、集群
    .NET 跨域问题
    C# 利用正则表达式获取富文本框中所有图片路劲
    ActiveMQ入门实例(.NET)
    ActiveMQ的使用以及应用场景
    关于消息队列的使用方法(RocketMQ)
    Redis系列 需要注意事项
    .NET:在线悲观锁、在线乐观锁、离线悲观锁、离线乐观锁代码示例
    C# 简单介绍Redis使用
    API Get跟Post 的区别?
  • 原文地址:https://www.cnblogs.com/springsnow/p/9433976.html
Copyright © 2020-2023  润新知