在Drupal 8的预处理功能中获取图像样式高度

get image style height in pre process function in Drupal 8

我将 Drupal 8 与出色的内联响应图像模块一起使用。我想在呈现 <picture> 元素之前更改 img 字段(后备图像),更具体地说:我需要将 widthheight 参数添加到 <img> 字段。因此,我使用 preprocess_image 钩子。

这个钩子为我提供了一堆变量,最显着的是 $variables[attributes]。 由于某些原因,$variables[width]$variables[height]$variables[uri] 都是空字符串。幸运的是 $variables[attributes] 包含: $variables[attributes][data-entity-uuid]$variables[attributes][srcset] 所以至少我有样式图像的路径和原始图像的 uuid。

我想有两种方法可以到达我想去的地方(即加载样式图像并获取高度和宽度):

  1. 将路径转换为 ​​uri(或者它是路径)?
  2. 从 uuid 中获取文件 ID,然后以某种方式从样式化图像中获取 uri(这似乎绕了我想要的东西)

我无法使用选项 1。 srcset中的路径是这样的: /sites/default/files/styles/image_lightbox/public/inline-images/erf-2.jpg?itok=4_EU9Ttx 并且我想我需要将其转换为 public://styles/image_lightbox/public/inline-images/erf-2.jpg 但卡在了类似的地方:

$parsed_url = parse_url($variables['attributes']['srcset']);
$path = file_build_uri($parsed_url['path']);

但这仍然留下了 /sites/default/files 部分

我无法使用选项 2。我被困在:

$file_array = \Drupal::entityTypeManager()->getStorage('file')->loadByProperties(['uuid' => $img_uuid]);
$file_id = reset(array_keys($file_array));
$file = File::load($file_id);
$image_uri = ImageStyle::load('image-lightbox')->buildUrl($file->getFileUri());
$image = \Drupal::service('image.factory')->get($image_uri);

由于某种原因,这在 $file = File::load($file_id) 处失败了

在我浪费了 8 个小时来解决这个问题之后,如果有任何帮助,我将不胜感激

答案比我想象的要简单得多。

事实证明选项 1 非常简单: 而不是将 /sites/default/files/styles/image_lightbox/public/inline-images/erf-2.jpg?itok=4_EU9Ttx(从 $variables[attributes][srcset])转换为 public://styles/image_lightbox/public/inline-images/erf-2.jpg。我不得不将它转换为 http://hostname/path-to-drupal-install/sites/default/files/styles/image_lightbox/public/inline-images/erf-2.jpg?itok=4_EU9Ttx,我这样做是这样的:

global $base_url;
$image_uri = $base_url.$variables['attributes']['srcset'];