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();
}

使用方法:

  1. 将上述头文件代码和 cpp 代码分别保存为 PixelReaderLibrary.h 和 PixelReaderLibrary.cpp,并将它们放在项目的 Source 文件夹下的任意子文件夹中。
  2. 在 UE5 编辑器中创建一个蓝图 Actor,打开蓝图编辑器。
  3. 在蓝图编辑器中,右键单击空白处,选择“Add New Variable”,创建一个类型为 Texture2D 的变量,并将其命名为“InputTexture”。
  4. 在蓝图编辑器中,右键单击空白处,选择“Add New Variable”,创建一个类型为 Int32 的变量,并将其命名为“Width”。
  5. 在蓝图编辑器中,右键单击空白处,选择“Add New Variable”,创建一个类型为 Int32 的变量,并将其命名为“Height”。
  6. 在蓝图编辑器中,右键单击空白处,选择“Add Component”,选择“Sphere”或其他任意类型的组件。
  7. 在蓝图编辑器中,右键单击空白处,选择“Add Custom Event”,将其命名为“ReadPixels”。
  8. 在蓝图编辑器中,将 InputTexture 拖拽到蓝图编辑器中,连接到 ReadPixels 节点的输入端口上。
  9. 在蓝图编辑器中,将 Width 和 Height 拖拽到蓝图编辑器中,连接到 ReadPixels 节点的输出端口上。
  10. 在蓝图编辑器中,右键单击空白处,选择“Add Function”,将其命名为“GetPixels”。
  11. 在蓝图编辑器中,打开 GetPixels 函数,将以下代码复制粘贴到函数中:
UPixelReaderLibrary::ReadPixelsFromTexture(InputTexture, Pixels);
Width = InputTexture->GetSizeX();
Height = InputTexture->GetSizeY();
  1. 在蓝图编辑器中,将 GetPixels 函数拖拽到蓝图编辑器中,连接到 ReadPixels 节点的输出端口上。
  2. 在蓝图编辑器中,右键单击空白处,选择“Add New Variable”,创建一个类型为 Byte 的数组,并将其命名为“Pixels”。
  3. 在蓝图编辑器中,将 Pixels 拖拽到蓝图编辑器中,连接到 GetPixels 节点的输入端口上。
  4. 在蓝图编辑器中,右键单击空白处,选择“Add Custom Event”,将其命名为“PrintPixels”。
  5. 在蓝图编辑器中,将 Pixels 拖拽到蓝图编辑器中,连接到 PrintPixels 节点的输入端口上。
  6. 在蓝图编辑器中,打开 PrintPixels 事件,将以下代码复制粘贴到事件中:
for (int i = 0; i < Pixels.Num(); i++)
{
    UE_LOG(LogTemp, Log, TEXT("Pixel %d: %d"), i, Pixels[i]);
}
  1. 在蓝图编辑器中,保存蓝图,并关闭蓝图编辑器。
  2. 在场景中添加该蓝图 Actor,并将 InputTexture 设置为任意一张图片。
  3. 在场景中选中该蓝图 Actor,打开蓝图属性面板,点击 ReadPixels 按钮,等待一段时间,直到 Width 和 Height 的值被更新为图片的宽度和高度。
  4. 在蓝图属性面板中,点击 PrintPixels 按钮,查看输出日志中的像素灰度值。

总结

通过以上步骤,开发者可以轻松地将该蓝图节点集成到自己的项目中,并使用它来读取图片的灰度值,实现各种图像处理功能。

UE5 蓝图节点:从图片读取灰度值并输出到数组

原文地址: https://www.cveoy.top/t/topic/jtIi 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录