C#中的图像Image类与打印Printing类用法

作者:springsnow 时间:2022-07-25 06:24:36 

一、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 以指定格式保存到指定文件。

4、绘制图片:

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));
}

5、缩放:

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

6、获取缩略图

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

7、旋转

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

8、双倍缓冲

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

9、格式转换与保存:

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;
   }
}

来源:https://www.cnblogs.com/springsnow/p/9433976.html

标签:C#,图像,Image,类,打印,Printing
0
投稿

猜你喜欢

  • Mybatis动态SQL foreach标签用法实例

    2023-12-25 07:42:46
  • Java的数据类型和参数传递(详解)

    2022-12-30 18:52:25
  • unity里获取text中文字宽度并截断省略的操作

    2023-11-02 07:48:52
  • Android自定义View实现拼图小游戏

    2023-07-13 13:53:39
  • Java选择排序和垃圾回收机制详情

    2023-10-23 16:53:38
  • Java接口幂等性设计原理解析

    2022-12-22 12:27:01
  • Java实现角色扮演游戏的示例代码

    2023-03-31 19:41:45
  • c#和net存取cookies操作示例

    2023-10-11 15:28:26
  • 详解SpringBoot中Session超时原理说明

    2022-01-24 06:40:49
  • java反射获取和调用方法

    2021-11-23 11:05:02
  • Android实现中轴旋转特效 Android制作别样的图片浏览器

    2023-07-03 00:37:16
  • C#程序提示“正由另一进程使用,因此该进程无法访问该文件”的解决办法

    2022-06-27 04:34:11
  • Java二维数组实战案例

    2022-08-13 08:59:25
  • 浅谈C#泛型的用处与特点

    2022-04-22 02:39:35
  • 浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    2022-03-16 06:35:41
  • Java环境下高德地图Api的使用方式

    2022-06-13 06:43:59
  • 记一次公司JVM堆溢出抽丝剥茧定位的过程解析

    2023-11-09 13:11:24
  • C#中数组、ArrayList、List、Dictionary的用法与区别浅析(存取数据)

    2021-05-27 03:55:49
  • 【Redis缓存机制】详解Java连接Redis_Jedis_事务

    2023-05-23 19:59:55
  • Java输入输出流实例详解

    2023-05-28 15:54:35
  • asp之家 软件编程 m.aspxhome.com