Features
云策文档标注
概述
本文档介绍了 WordPress 中 Features 类的核心功能,主要用于处理图像或媒体项目的特征数据,如宽度、高度、位深度和通道数。通过两个主要方法 get_item_features 和 get_primary_item_features,实现从内部存储结构中绑定和检索这些特征信息。
关键要点
- Features 类包含公共属性如 has_primary_item、has_alpha、primary_item_id 和 primary_item_features 数组,用于存储项目特征状态和数据。
- get_item_features 方法是一个私有函数,通过递归搜索 props、dim_props 和 chan_props 数组,绑定指定项目的宽度、高度、位深度和通道数。
- get_primary_item_features 方法是一个公共函数,调用 get_item_features 来查找主项目的特征,并处理 alpha 通道(如果存在),增加通道数。
- 类中使用了常量如 UNDEFINED、FOUND 和 NOT_FOUND 来表示状态和未定义值,确保数据处理的准确性。
代码示例
public function get_primary_item_features() {
// Nothing to do without the primary item ID.
if ( !$this->has_primary_item ) {
return NOT_FOUND;
}
// Early exit.
if ( empty( $this->dim_props ) || empty( $this->chan_props ) ) {
return NOT_FOUND;
}
$status = $this->get_item_features( $this->primary_item_id, /*tile_depth=*/ 0 );
if ( $status != FOUND ) {
return $status;
}
// "auxC" is parsed before the "ipma" properties so it is known now, if any.
if ( $this->has_alpha ) {
++$this->primary_item_features['num_channels'];
}
return FOUND;
}注意事项
- 在使用 get_primary_item_features 方法前,需确保 has_primary_item 为 true,且 dim_props 和 chan_props 数组非空,否则会返回 NOT_FOUND。
- get_item_features 方法涉及递归搜索,需注意 tile_depth 参数以避免无限循环,确保性能优化。
- alpha 通道的处理依赖于 has_alpha 属性,如果存在,会自动增加 num_channels 的值,开发者需了解此逻辑以避免数据不一致。
原文内容
Methods
| Name | Description |
|---|---|
| Features::get_item_features | Binds the width, height, bit depth and number of channels from stored internal features. |
| Features::get_primary_item_features | Finds the width, height, bit depth and number of channels of the primary item. |
Source
class Features {
public $has_primary_item = false; // True if "pitm" was parsed.
public $has_alpha = false; // True if an alpha "auxC" was parsed.
public $primary_item_id;
public $primary_item_features = array( // Deduced from the data below.
'width' => UNDEFINED, // In number of pixels.
'height' => UNDEFINED, // Ignores mirror and rotation.
'bit_depth' => UNDEFINED, // Likely 8, 10 or 12 bits per channel per pixel.
'num_channels' => UNDEFINED // Likely 1, 2, 3 or 4 channels:
// (1 monochrome or 3 colors) + (0 or 1 alpha)
);
public $tiles = array(); // Tile[]
public $props = array(); // Prop[]
public $dim_props = array(); // Dim_Prop[]
public $chan_props = array(); // Chan_Prop[]
/**
* Binds the width, height, bit depth and number of channels from stored internal features.
*
* @param int $target_item_id Id of the item whose features will be bound.
* @param int $tile_depth Maximum recursion to search within tile-parent relations.
* @return Status FOUND on success or NOT_FOUND on failure.
*/
private function get_item_features( $target_item_id, $tile_depth ) {
foreach ( $this->props as $prop ) {
if ( $prop->item_id != $target_item_id ) {
continue;
}
// Retrieve the width and height of the primary item if not already done.
if ( $target_item_id == $this->primary_item_id &&
( $this->primary_item_features['width'] == UNDEFINED ||
$this->primary_item_features['height'] == UNDEFINED ) ) {
foreach ( $this->dim_props as $dim_prop ) {
if ( $dim_prop->property_index != $prop->property_index ) {
continue;
}
$this->primary_item_features['width'] = $dim_prop->width;
$this->primary_item_features['height'] = $dim_prop->height;
if ( $this->primary_item_features['bit_depth'] != UNDEFINED &&
$this->primary_item_features['num_channels'] != UNDEFINED ) {
return FOUND;
}
break;
}
}
// Retrieve the bit depth and number of channels of the target item if not
// already done.
if ( $this->primary_item_features['bit_depth'] == UNDEFINED ||
$this->primary_item_features['num_channels'] == UNDEFINED ) {
foreach ( $this->chan_props as $chan_prop ) {
if ( $chan_prop->property_index != $prop->property_index ) {
continue;
}
$this->primary_item_features['bit_depth'] = $chan_prop->bit_depth;
$this->primary_item_features['num_channels'] = $chan_prop->num_channels;
if ( $this->primary_item_features['width'] != UNDEFINED &&
$this->primary_item_features['height'] != UNDEFINED ) {
return FOUND;
}
break;
}
}
}
// Check for the bit_depth and num_channels in a tile if not yet found.
if ( $tile_depth < 3 ) {
foreach ( $this->tiles as $tile ) {
if ( $tile->parent_item_id != $target_item_id ) {
continue;
}
$status = $this->get_item_features( $tile->tile_item_id, $tile_depth + 1 );
if ( $status != NOT_FOUND ) {
return $status;
}
}
}
return NOT_FOUND;
}
/**
* Finds the width, height, bit depth and number of channels of the primary item.
*
* @return Status FOUND on success or NOT_FOUND on failure.
*/
public function get_primary_item_features() {
// Nothing to do without the primary item ID.
if ( !$this->has_primary_item ) {
return NOT_FOUND;
}
// Early exit.
if ( empty( $this->dim_props ) || empty( $this->chan_props ) ) {
return NOT_FOUND;
}
$status = $this->get_item_features( $this->primary_item_id, /*tile_depth=*/ 0 );
if ( $status != FOUND ) {
return $status;
}
// "auxC" is parsed before the "ipma" properties so it is known now, if any.
if ( $this->has_alpha ) {
++$this->primary_item_features['num_channels'];
}
return FOUND;
}
}