使用图形状态

PS 文件的剪辑和变换图形状态

 

管理 PS 文档中的图形状态(相当于 XPS 中的画布)是 Aspose.Page for .NET 提供的主要功能之一。在下面的示例中,您将了解如何:

  • 保存当前图形状态,创建新的图形状态,并将其设置为当前状态。

  • 平移、缩放、旋转或剪切当前图形状态。

  • 为当前图形状态设置复杂的变换。

  • 设置当前图形状态的绘画和描边。

  • 填充并绘制图形路径。

  • 剪辑图形状态。

  • 恢复之前的图形状态。

要转换 PS 文件的图形状态,请遵循以下指南:

  1. 使用 PsDocument Class 创建 PS 文件。
  2. 创建矩形图形路径。
  3. 保存当前图形状态,创建一个新的图形状态,并使用 将其设置为当前状态 WriteGraphicsSave() 方法。
  4. 使用 Translate() 方法平移当前图形状态。
  5. 使用 SetPaint() 方法在当前图形状态下设置绘制。
  6. 通过 Fill() 方法填充图形路径。
  7. 使用 WriteGraphicsRestore 方法恢复以前的图形状态。
  8. 重复步骤 3-7,使用 Scale()旋转()剪切()Transform() 方法。
  9. 通过 ClosePage() 方法关闭当前页面。
  10. 使用 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 文件的图形状态,请遵循以下指南:

  1. 使用 PsDocument Class 创建 PS 文件。
  2. 创建矩形图形路径。
  3. 保存当前图形状态,创建一个新的图形状态,并使用 将其设置为当前状态 WriteGraphicsSave() 方法。
  4. 使用 Translate() 方法平移当前图形状态。
  5. 创建圆形图形路径。
  6. 使用 Clip() 方法将圆形剪辑添加到当前图形状态。
  7. 使用 SetPaint() 方法在当前图形状态下设置绘制。
  8. 通过 Fill() 方法填充矩形图形路径。
  9. 使用 WriteGraphicsRestore() 方法恢复之前的图形状态。
  10. 使用 Translate() 方法平移当前图形状态。
  11. 创建一个 System.Drawing.Pen 对象。
  12. 使用 SetStroke() 方法在当前图形状态下设置笔划。
  13. 通过 Draw() 方法在剪切矩形上方绘制矩形图形路径。
  14. 通过 ClosePage() 方法关闭当前页面。
  15. 使用 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 命令(例如gsavegrestore)分别保存和恢复图形状态来完成。此外,可以使用setlinewidthsetrgbcolorsetdash等运算符根据需要修改图形状态的特定属性。

3. 为什么理解和管理 PostScript (PS) 文档中的图形状态很重要?

通过操纵图形状态,您可以实现变换、颜色变化和剪切区域等效果,确保图形按照您的设计规范正确显示。它还有助于优化文件大小和性能,特别是在处理复杂或重复的图形元素时。

PS 什么是PS文件格式

PS 格式是页面描述语言 (PDL) 格式之一。它能够在页面上包含图形和文本信息。这就是为什么大多数图像编辑程序都支持该格式的原因。 postscript 文件本身就是对打印机的一种指令。它包含有关从其页面打印什么以及如何打印的信息。