UE5 蓝图节点:从图片读取灰度值并输出到数组
UE5 蓝图节点:从图片读取灰度值并输出到数组
本文提供了一个使用 C++ 编写的 UE5 蓝图节点,该节点可以从输入图片逐像素读取灰度值,并将灰度值输出到一个数组中。
头文件代码:
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "PixelReaderLibrary.generated.h"
UCLASS()
class MYPROJECT_API UPixelReaderLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "PixelReader")
static void ReadPixelsFromTexture(UTexture2D* Texture, TArray<uint8>& Pixels);
};
cpp 代码:
#include "PixelReaderLibrary.h"
#include "Engine/Texture2D.h"
void UPixelReaderLibrary::ReadPixelsFromTexture(UTexture2D* Texture, TArray<uint8>& Pixels)
{
if (!Texture)
{
return;
}
FTexture2DMipMap& Mip = Texture->PlatformData->Mips[0];
const uint8* DataPtr = (const uint8*)Mip.BulkData.LockReadOnly();
const int32 Width = Mip.SizeX;
const int32 Height = Mip.SizeY;
Pixels.Empty();
Pixels.Reserve(Width * Height);
for (int32 y = 0; y < Height; ++y)
{
for (int32 x = 0; x < Width; ++x)
{
const uint8* PixelPtr = DataPtr + (x + y * Width) * sizeof(FColor);
FColor PixelColor = *(FColor*)PixelPtr;
uint8 GrayScale = (PixelColor.R + PixelColor.G + PixelColor.B) / 3;
Pixels.Add(GrayScale);
}
}
Mip.BulkData.Unlock();
}
使用方法:
- 将上述头文件代码和 cpp 代码分别保存为 PixelReaderLibrary.h 和 PixelReaderLibrary.cpp,并将它们放在项目的 Source 文件夹下的任意子文件夹中。
- 在 UE5 编辑器中创建一个蓝图 Actor,打开蓝图编辑器。
- 在蓝图编辑器中,右键单击空白处,选择“Add New Variable”,创建一个类型为 Texture2D 的变量,并将其命名为“InputTexture”。
- 在蓝图编辑器中,右键单击空白处,选择“Add New Variable”,创建一个类型为 Int32 的变量,并将其命名为“Width”。
- 在蓝图编辑器中,右键单击空白处,选择“Add New Variable”,创建一个类型为 Int32 的变量,并将其命名为“Height”。
- 在蓝图编辑器中,右键单击空白处,选择“Add Component”,选择“Sphere”或其他任意类型的组件。
- 在蓝图编辑器中,右键单击空白处,选择“Add Custom Event”,将其命名为“ReadPixels”。
- 在蓝图编辑器中,将 InputTexture 拖拽到蓝图编辑器中,连接到 ReadPixels 节点的输入端口上。
- 在蓝图编辑器中,将 Width 和 Height 拖拽到蓝图编辑器中,连接到 ReadPixels 节点的输出端口上。
- 在蓝图编辑器中,右键单击空白处,选择“Add Function”,将其命名为“GetPixels”。
- 在蓝图编辑器中,打开 GetPixels 函数,将以下代码复制粘贴到函数中:
UPixelReaderLibrary::ReadPixelsFromTexture(InputTexture, Pixels);
Width = InputTexture->GetSizeX();
Height = InputTexture->GetSizeY();
- 在蓝图编辑器中,将 GetPixels 函数拖拽到蓝图编辑器中,连接到 ReadPixels 节点的输出端口上。
- 在蓝图编辑器中,右键单击空白处,选择“Add New Variable”,创建一个类型为 Byte 的数组,并将其命名为“Pixels”。
- 在蓝图编辑器中,将 Pixels 拖拽到蓝图编辑器中,连接到 GetPixels 节点的输入端口上。
- 在蓝图编辑器中,右键单击空白处,选择“Add Custom Event”,将其命名为“PrintPixels”。
- 在蓝图编辑器中,将 Pixels 拖拽到蓝图编辑器中,连接到 PrintPixels 节点的输入端口上。
- 在蓝图编辑器中,打开 PrintPixels 事件,将以下代码复制粘贴到事件中:
for (int i = 0; i < Pixels.Num(); i++)
{
UE_LOG(LogTemp, Log, TEXT("Pixel %d: %d"), i, Pixels[i]);
}
- 在蓝图编辑器中,保存蓝图,并关闭蓝图编辑器。
- 在场景中添加该蓝图 Actor,并将 InputTexture 设置为任意一张图片。
- 在场景中选中该蓝图 Actor,打开蓝图属性面板,点击 ReadPixels 按钮,等待一段时间,直到 Width 和 Height 的值被更新为图片的宽度和高度。
- 在蓝图属性面板中,点击 PrintPixels 按钮,查看输出日志中的像素灰度值。
总结
通过以上步骤,开发者可以轻松地将该蓝图节点集成到自己的项目中,并使用它来读取图片的灰度值,实现各种图像处理功能。
原文地址: https://www.cveoy.top/t/topic/jtIi 著作权归作者所有。请勿转载和采集!