使用图形状态
PS 文件的剪辑和变换图形状态
管理 PS 文档中的图形状态(相当于 XPS 中的画布)是 Aspose.Page for .NET 提供的主要功能之一。在下面的示例中,您将了解如何:
保存当前图形状态,创建新的图形状态,并将其设置为当前状态。
平移、缩放、旋转或剪切当前图形状态。
为当前图形状态设置复杂的变换。
设置当前图形状态的绘画和描边。
填充并绘制图形路径。
剪辑图形状态。
恢复之前的图形状态。
要转换 PS 文件的图形状态,请遵循以下指南:
- 使用 PsDocument Class 创建 PS 文件。
- 创建矩形图形路径。
- 保存当前图形状态,创建一个新的图形状态,并使用 将其设置为当前状态 WriteGraphicsSave() 方法。
- 使用 Translate() 方法平移当前图形状态。
- 使用 SetPaint() 方法在当前图形状态下设置绘制。
- 通过 Fill() 方法填充图形路径。
- 使用 WriteGraphicsRestore 方法恢复以前的图形状态。
- 重复步骤 3-7,使用 Scale() 、 旋转() , 剪切() 和 Transform() 方法。
- 通过 ClosePage() 方法关闭当前页面。
- 使用 PsDocument.Save() 方法保存创建的 PS 文档。
PS文件图形状态变换C#代码
using Aspose.Page.EPS;
using Aspose.Page.EPS.Device;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithCanvas();
//Create output stream for PostScript document
using (Stream outPsStream = new FileStream(dataDir + "Transformations_outPS.ps", FileMode.Create))
{
//Create save options with default values
PsSaveOptions options = new PsSaveOptions();
// Create new 1-paged PS Document
PsDocument document = new PsDocument(outPsStream, options, false);
//Create graphics path from the rectangle
System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
path.AddRectangle(new System.Drawing.RectangleF(0, 0, 150, 100));
///////////////////// Translation //////////////////////////////////////////////////////////////////////
//Save graphics state in order to return back to this state after transformation
document.WriteGraphicsSave();
//Displace current graphics state on 250 to the right. So we add translation component to the current transformation.
document.Translate(250, 0);
//Set paint in the current graphics state
document.SetPaint(new System.Drawing.SolidBrush(Color.Blue));
//Fill the second rectangle in the current graphics state (has translation transformation)
document.Fill(path);
//Restore graphics state to the previus (upper) level
document.WriteGraphicsRestore();
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//Displace on 200 to the bottom.
document.Translate(0, 200);
////////////////////// Scaling //////////////////////////////////////////////////////////////////////////
//Save graphics state in order to return back to this state after transformation
document.WriteGraphicsSave();
//Scale current graphics state on 0.5 in X axis and on 0.75f in Y axis. So we add scale component to the current transformation.
document.Scale(0.5f, 0.75f);
//Set paint in the current graphics state
document.SetPaint(new System.Drawing.SolidBrush(Color.Red));
//Fill the third rectangle in the current graphics state (has scale transformation)
document.Fill(path);
//Restore graphics state to the previus (upper) level
document.WriteGraphicsRestore();
//////////////////////////////////////////////////////////////////////////////////////////////////////
//Displace upper level graphics state on 250 to the right.
document.Translate(250, 0);
////////////////////// Rotation //////////////////////////////////////////////////////////////////////
//Save graphics state in order to return back to this state after transformation
document.WriteGraphicsSave();
//Rotate current graphics state on 45 degrees around origin of current graphics state (350, 300). So we add rotation component to the current transformation.
document.Rotate(45);
//Set paint in the current graphics state
document.SetPaint(new System.Drawing.SolidBrush(Color.Green));
//Fill the fourth rectangle in the current graphics state (has rotation transformation)
document.Fill(path);
//Restore graphics state to the previus (upper) level
document.WriteGraphicsRestore();
//////////////////////////////////////////////////////////////////////////////////////////////////////
//Returns upper level graphics state back to the left and displace on 200 to the bottom.
document.Translate(-250, 200);
////////////////////// Shearing //////////////////////////////////////////////////////////////////////
//Save graphics state in order to return back to this state after transformation
document.WriteGraphicsSave();
//Shear current graphics state. So we add shear component to the current transformation.
document.Shear(0.1f, 0.2f);
//Set paint in the current graphics state
document.SetPaint(new System.Drawing.SolidBrush(Color.Pink));
//Fill the fifth rectangle in the current graphics state (has shear transformation)
document.Fill(path);
//Restore graphics state to the previus (upper) level
document.WriteGraphicsRestore();
//////////////////////////////////////////////////////////////////////////////////////////////////////
//Displace upper level graphics state on 250 to the right.
document.Translate(250, 0);
////////////////////// Complex transformation ////////////////////////////////////////////////////////
//Save graphics state in order to return back to this state after transformation
document.WriteGraphicsSave();
//Transform current graphics state with complex transformation. So we add translation, scale and rotation components to the current transformation.
document.Transform(new System.Drawing.Drawing2D.Matrix(1.2f, -0.965925f, 0.258819f, 1.5f, 0f, 50));
//Set paint in the current graphics state
document.SetPaint(new System.Drawing.SolidBrush(Color.Aquamarine));
//Fill the sixth rectangle in the current graphics state (has complex transformation)
document.Fill(path);
//Restore graphics state to the previus (upper) level
document.WriteGraphicsRestore();
//////////////////////////////////////////////////////////////////////////////////////////////////////
//Close current page
document.ClosePage();
//Save the document
document.Save();
}
要将剪辑添加到 PS 文件的图形状态,请遵循以下指南:
- 使用 PsDocument Class 创建 PS 文件。
- 创建矩形图形路径。
- 保存当前图形状态,创建一个新的图形状态,并使用 将其设置为当前状态 WriteGraphicsSave() 方法。
- 使用 Translate() 方法平移当前图形状态。
- 创建圆形图形路径。
- 使用 Clip() 方法将圆形剪辑添加到当前图形状态。
- 使用 SetPaint() 方法在当前图形状态下设置绘制。
- 通过 Fill() 方法填充矩形图形路径。
- 使用 WriteGraphicsRestore() 方法恢复之前的图形状态。
- 使用 Translate() 方法平移当前图形状态。
- 创建一个 System.Drawing.Pen 对象。
- 使用 SetStroke() 方法在当前图形状态下设置笔划。
- 通过 Draw() 方法在剪切矩形上方绘制矩形图形路径。
- 通过 ClosePage() 方法关闭当前页面。
- 使用 PsDocument.Save() 方法保存创建的 PS 文档。
PS文件图形状态裁剪C#代码
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithCanvas();
//Create output stream for PostScript document
using (Stream outPsStream = new FileStream(dataDir + "Clipping_outPS.ps", FileMode.Create))
{
//Create save options with default values
PsSaveOptions options = new PsSaveOptions();
// Create new 1-paged PS Document
PsDocument document = new PsDocument(outPsStream, options, false);
//Create graphics path from the rectangle
System.Drawing.Drawing2D.GraphicsPath rectangePath = new System.Drawing.Drawing2D.GraphicsPath();
rectangePath.AddRectangle(new System.Drawing.RectangleF(0, 0, 300, 200));
////////////////////// Clipping by shape //////////////////////////////////////////////////////////////////////
//Save graphics state in order to return back to this state after transformation
document.WriteGraphicsSave();
//Displace current graphics state on 100 points to the right and 100 points to the bottom.
document.Translate(100, 100);
//Create graphics path from the circle
System.Drawing.Drawing2D.GraphicsPath circlePath = new System.Drawing.Drawing2D.GraphicsPath();
circlePath.AddEllipse(new System.Drawing.RectangleF(50, 0, 200, 200));
//Add clipping by circle to the current graphics state
document.Clip(circlePath);
//Set paint in the current graphics state
document.SetPaint(new System.Drawing.SolidBrush(Color.Blue));
//Fill the rectangle in the current graphics state (with clipping)
document.Fill(rectangePath);
//Restore graphics state to the previus (upper) level
document.WriteGraphicsRestore();
//Displace upper level graphics state on 100 points to the right and 100 points to the bottom.
document.Translate(100, 100);
Pen pen = new Pen(new SolidBrush(Color.Blue), 2);
pen.DashStyle = DashStyle.Dash;
document.SetStroke(pen);
//Draw the rectangle in the current graphics state (has no clipping) above clipped rectngle
document.Draw(rectangePath);
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//Close current page
document.ClosePage();
//Save the document
document.Save();
}
常问问题
1. PostScript (PS) 文档中的图形状态是什么?
PostScript 中的图形状态是应用于文档内图形元素的当前设置和属性。它们包括当前变换矩阵、线条样式、填充颜色、剪切路径以及其他影响元素在页面上呈现方式的图形属性等参数。
2. 如何管理 PS 文档中的图形状态?
这可以使用 PostScript 命令(例如gsave
和grestore
)分别保存和恢复图形状态来完成。此外,可以使用setlinewidth
、setrgbcolor
和setdash
等运算符根据需要修改图形状态的特定属性。
3. 为什么理解和管理 PostScript (PS) 文档中的图形状态很重要?
通过操纵图形状态,您可以实现变换、颜色变化和剪切区域等效果,确保图形按照您的设计规范正确显示。它还有助于优化文件大小和性能,特别是在处理复杂或重复的图形元素时。
PS 什么是PS文件格式
PS 格式是页面描述语言 (PDL) 格式之一。它能够在页面上包含图形和文本信息。这就是为什么大多数图像编辑程序都支持该格式的原因。 postscript 文件本身就是对打印机的一种指令。它包含有关从其页面打印什么以及如何打印的信息。