UE 蓝图:使用像素读取图像灰度值并存储在数组中
以下是一个基本的蓝图,可以按像素读取图片的灰度值,然后将其存储在一个数组中。你可以将其作为一个actor使用,然后在其他的actor中调用它。

步骤:
- 从Actor类创建一个新的蓝图。
- 添加一个Texture2D变量,用于存储要读取的图片。
- 添加一个Dynamic Material Instance变量,用于创建材质实例,以便可以使用像素操作。
- 添加一个数组变量,用于存储图像的灰度值。
- 添加一个构造函数,将Dynamic Material Instance设置为渲染材质,并将其添加到场景中。
- 添加一个函数,用于读取图像的灰度值。
// 1. 添加一个Texture2D变量,用于存储要读取的图片
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Image')
UTexture2D* Image;
// 2. 添加一个Dynamic Material Instance变量,用于创建材质实例,以便可以使用像素操作
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Image')
UDynamicMaterialInstance* DynamicMaterial;
// 4. 添加一个数组变量,用于存储图像的灰度值
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Image')
TArray<float> ImageData;
// 5. 添加一个构造函数,将Dynamic Material Instance设置为渲染材质,并将其添加到场景中
AMyActor()
{
// 创建动态材质实例
DynamicMaterial = UMaterialInstanceDynamic::Create(Material, this);
// 将动态材质实例设置为渲染材质
SetMaterial(0, DynamicMaterial);
}
// 6. 添加一个函数,用于读取图像的灰度值
UFUNCTION(BlueprintCallable, Category = 'Image')
void ReadImage()
{
// 获取图像的大小
int32 Width = Image->GetSizeX();
int32 Height = Image->GetSizeY();
// 获取材质实例的纹理参数
UTexture* Texture = DynamicMaterial->GetTextureParameterValue(TEXT('Image'));
UTexture2D* Texture2D = Cast<UTexture2D>(Texture);
FTexture2DMipMap& Mip = Texture2D->PlatformData->Mips[0];
void* Data = Mip.BulkData.Lock(LOCK_READ_ONLY);
// 计算每个像素的灰度值,并将其存储在数组中
for (int32 Y = 0; Y < Height; Y++)
{
for (int32 X = 0; X < Width; X++)
{
// 计算像素的颜色
FColor Color = ((FColor*)Data)[Y * Width + X];
// 计算像素的灰度值
float Grey = 0.299 * Color.R + 0.587 * Color.G + 0.114 * Color.B;
// 将灰度值存储在数组中
ImageData.Add(Grey);
}
}
// 解锁纹理数据
Mip.BulkData.Unlock();
}
现在你可以在其他的actor中调用ReadImage函数,以便读取图像的灰度值并存储在数组中。
原文地址: https://www.cveoy.top/t/topic/ndsc 著作权归作者所有。请勿转载和采集!