Работа с графическими состояниями

Вырезайте и преобразуйте графические состояния файлов PS.

 

Управление состояниями графики в документах PS (эквивалент холстов в XPS) — одна из основных функций, предлагаемых Aspose.Page для .NET. В примере ниже вы узнаете, как:

  • Сохраните текущее состояние графики, создайте новое состояние графики и установите его как текущее.

  • Перемещайте, масштабируйте, вращайте или сдвигайте текущее состояние графики.

  • Установите сложное преобразование для текущего состояния графики.

  • Установите краску и обводку для текущего состояния графики.

  • Заполните и нарисуйте графический путь.

  • Закрепите состояние графики.

  • Восстановите предыдущее состояние графики.

Чтобы преобразовать графические состояния файла PS, следуйте следующему руководству:

  1. Создайте файл PS, используя PsDocument Class .
  2. Создайте прямоугольный графический путь.
  3. Сохраните текущее состояние графики, создайте новое состояние графики и установите его как текущее с помощью WriteGraphicsSave() Метод.
  4. Переведите текущее состояние графики с помощью метода Translate() .
  5. Установите отрисовку в текущее состояние графики с помощью метода SetPaint() .
  6. Заполните графический путь с помощью метода Fill() .
  7. Восстановите предыдущее состояние графики с помощью метода WriteGraphicsRestore .
  8. Повторите шаги 3–7, чтобы добавить дополнительные графические состояния с помощью других преобразований, используя Scale() , Rotate() , Shear() и Transform() Методы.
  9. Закройте текущую страницу с помощью метода ClosePage() .
  10. Сохраните созданный документ PS, используя метод PsDocument.Save() .

Состояние графики файла 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. Создайте файл PS, используя PsDocument Class .
  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. Сохраните созданный документ PS, используя метод PsDocument.Save() .

Обрезка состояния графики 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 является своеобразной инструкцией для принтеров. Он содержит информацию о том, что и как печатать со своей страницы.