SVG получают текстовую ширину элемента

В некоторых случаях неизменность вынуждает вас клонировать объект и должна выделять больше памяти. Нет необходимости занимать память, потому что старые копии могут быть сброшены. Например, сборщик мусора в CLR справляется с этой ситуацией достаточно хорошо, так что это (обычно) не имеет большого значения.

Тем не менее, цепочка операций на самом деле не означает клонирование объекта. Это, безусловно, относится к функциональным спискам. Когда вы используете их обычным способом, вам нужно выделить ячейку памяти только для одного элемента (при добавлении элементов в начало списка).

Ваш пример с обработкой изображений также может быть реализован более эффективным способом. Я буду использовать синтаксис C #, чтобы код был легким для понимания без знания FP (но на обычном функциональном языке он выглядел бы лучше). Вместо того, чтобы на самом деле клонировать изображение, вы можете просто сохранить операции, которые вы хотите сделать с изображением. Например, что-то вроде этого:

class Image { 
  Bitmap source;
  FileFormat format;
  float newWidth, newHeight;
  float rotation;

  // Public constructor to load the image from a file
  public Image(string sourceFile) { 
    this.source = Bitmap.FromFile(sourceFile); 
    this.newWidth = this.source.Width;
    this.newHeight = this.source.Height;
  }

  // Private constructor used by the 'cloning' methods
  private Image(Bitmap s, float w, float h, float r, FileFormat fmt) {
    source = s; newWidth = w; newHeight = h; 
    rotation = r; format = fmt;
  }

  // Methods that can be used for creating modified clones of
  // the 'Image' value using method chaining - these methods only
  // store operations that we need to do later
  public Image Rotate(float r) {
    return new Image(source, newWidth, newHeight, rotation + r, format);
  }
  public Image Resize(float w, float h) {
    return new Image(source, w, h, rotation, format);
  }
  public Image ConvertTo(FileFormat fmt) {
    return new Image(source, newWidth, newHeight, rotation, fmt);
  }

  public void SaveFile(string f) { 
    // process all the operations here and save the image
  }
}

Класс на самом деле не создает клон всего растрового изображения каждый раз, когда вы вызываете метод. Он только отслеживает, что нужно сделать позже, когда вы наконец попытаетесь сохранить изображение. В следующем примере базовый Bitmap будет создан только один раз:

 var i = new Image("file.jpg");
 i.Resize(500, 800).Rotate(90).ConvertTo(Gif).SaveFile("fileNew.gif");

Итак, код выглядит так, как будто вы клонируете объект и фактически создаете новую копию Image каждый раз, когда вы вызываете какую-то операцию. Однако это не означает, что операция требует больших затрат памяти - ее можно скрыть в функциональной библиотеке, которая может быть реализована всевозможными способами (но при этом сохраняется важная ссылочная прозрачность ).

102
задан Eduard Luca 4 March 2016 в 11:35
поделиться

1 ответ

var bbox = textElement.getBBox();
var width = bbox.width;
var height = bbox.height;

, а затем соответствующим образом установите атрибуты прямоугольника.

Ссылка: getBBox () в стандарте SVG v1.1.

147
ответ дан 24 November 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: